Tuesday 10 October 2017

Php Konvertere String Til Binære Alternativer


En streng er bare en sekvens av byte, dermed dens faktisk binære data i PHP. Hva er det du prøver å gjøre Hvis du vil lagre binære data i databasen, er problemet oftest kolonnedisplayet i databasen. PHP skiller ikke mellom binære data og strenger, men databaser gjør. I MySQL bør du for eksempel lagre binære data i BINARY. VARBINARY eller BLOB kolonner. Et annet alternativ ville være å base64enkode PHP-strengen og lagre den i noen VARCHAR - eller TEKST-kolonne i databasen. Men vær oppmerksom på at strengens lengde vil øke når base64encode brukes. Din hash er allerede binær og klar til bruk med databasen. Men du må konvertere den til et format som databasekolonnementet forventer. En hvilken som helst streng i PHP (til 5.3) er en binær streng. Det betyr at den bare inneholder binære data. Men på grunn av bakoverkompatibilitet med PHP 6 kan du allerede kaste din streng eksplisitt som binær: Men det er bare av kompatibilitetshensyn, i koden din kan du bare gjøre: Fordi det er det samme. Konverteringen er overflødig. Vær trygg på at det fungerer perfekt. Det er kanskje bare et problem med forståelse for hva de kommandoerene gjør og hvilken strengkoding som er aktuelt i databasen. Søket ditt navn antyder at du ikke leter etter binær koding av btw, du bruker vanligvis den til koding av databasen, støtter ikke godt, og du ikke bruk databasen for å søke etter den. Bare sier det. ndash hakre 7 mai 16 kl 18:17 Jeg vil mest definitivt anbefale å bruke de innebygde standardpassordbibliotekene som følger med PHP - Her er et godt eksempel på hvordan du bruker dem. For de som kommer hit for å finne ut hvordan man går fra binære strenger til decimaler og tilbake, er det noen gode eksempler nedenfor. For å konvertere binære strenger til decimalschars kan du gjøre noe sånt. Ovennevnte utganger: For å konvertere decimaler til charstrings kan du gjøre dette: Ovennevnte utganger: Besvart 11. juni 15 kl 14:11 Strenger i PHP er alltid BLOBer. Så du kan bruke en streng for å holde verdien for databasen BLOB. Alt dette basekonvertering og så videre har å gjøre med å presentere den BLOB. Hvis du vil ha en god lesbar representasjon av BLOB-en din, så er det fornuftig å vise byter den inneholder, og sannsynligvis å bruke hex i stedet for desimal. Strengen 41 42 43 er derfor en god måte å presentere byte-arrayet som i C ville være, men det er åpenbart ikke en god måte å representere de byte Strengen ABC er en effektiv representasjon, fordi den faktisk er den samme BLOB bare det er ikke så stort i dette tilfellet). I praksis får du vanligvis dine BLOBer fra funksjoner som returnerer streng - som for eksempel hashfunksjonen eller andre innebygde funksjoner som fread. I sjeldne tilfeller (men ikke så sjelden når du bare prøver ting utprototyping) at du bare må konstruere en streng fra noen hardkodede byter, vet jeg ikke noe mer effektivt enn å konvertere en hex-streng til det som ofte kalles en binær streng i PHP: Hvis du kommer til live (data), viser du streng (3) ABC. Det er fordi 0x41 65 desimal A (i stort sett alle kodinger). Siden du ser på binære data ved å tolke den som en streng, ikke er nøyaktig intuitiv, kan det være lurt å lage et grunnleggende omslag for å gjøre debugging enklere. En mulig slik wrapper er Dette er noe jeg kokte opp på fly, og sannsynligvis bare et utgangspunkt for ditt eget wrapper. Men ideen er å bruke en streng for lagring, siden dette er den mest effektive strukturen som er tilgjengelig i PHP, samtidig som det gir metoder som toArray () for bruk i debugger watchesevaluations når du vil undersøke innholdet. Selvfølgelig kan du bruke et helt grei PHP-array i stedet, og pakke det til en streng når du knytter til noe som bruker strenge for binære data. Avhengig av hvilken grad du faktisk skal endre blokken, kan dette virke lettere, og selv om det ikke er rombesparende, tror jeg du får akseptabel ytelse for mange oppgaver. Et eksempel for å illustrere funksjonaliteten: En rask funksjon for å konvertere en binær streng til en sekvensfunksjon BinString2BitSequence (mystring) mybitseq end strlen (mystring) for (i 0 i lt end i) mybyte decbin (ord (mystring i)) konvertere char å bit streng mybitseq. substr (00000000. 0. 8 - strlen (mybyte)). mybyte 8 bit pakket returnert mybitseq echo BinString2BitSequence (ABCDEF) OUTPUT010000010100001001000011010001000100010101000110 Når det gjelder trailing nuller, etter test alle alternativene nevnt her av andre, har jeg utført mine egne tester angående effektivitet, her er resultatene: timestart mikrotime (true) for (i 0 i lt 1000 i) bin printf (08b desimal) timeend mikrotime (sann) tid tidsendring - timestart echo lthrgtDuracion tid segundosltbrgtn echo bin. ltbrgt timestart mikrotime (true) for (i 0 i lt 1000 i) bin sprintf (08d decbin (desimal)) timeend mikrotime (sann) tid tidsendring - timestart echo lthrgtDuracion tid segundosltbrgtn echo bin. ltbrgt timestart mikrotime (true) for (i 0 i lt 1000 i) bin decbin (desimal) bin substr (00000000. 0. 8 - strlen (bin)). bin timeend mikrotime (sann) tid tidsendring - timestart echo lthrgtDuracion tid segundosltbrgtn echo bin. ltbrgt 0000100100001001000010010000100. (utdata ekko 1000 ganger) Duracion 0.0134768486023 segundos 8 Duracion 0.00054407119751 segundos 00001001 Duracion 0.000833988189697 segundos 00001001 Således vinneren er ltphp bin sprintf (08d. decbin (decimal)) gt GNU MP biblioteket (phpmanualenbook. gmp. php) gir metoder for å effektivt konvertere binære strenger av hvilken som helst lengde til deres binære representasjon (dvs. en decbin-ekvivalent for strenger). str randombytes (1024) binært streng eksempelresultat gmpstrval (gmpimport (str), 2) se manual for alternativer som endianness nullPadded sprintf (0. (strlen (str) 8) s. resultat) nullpute hvis nødvendig, f. eks. med strpad eller sprintf som vist her strAgain gmpexport (gmpinit (result. 2)) revers operasjon ligner bindec Decimal til Binary konvertering ved hjelp av BCMath-utvidelsen. funksjon BCDec2Bin (Input) Output hvis (pregmatch (d. Input)) mens (Input 0) Output. chr (48 (Input 2)) Inngang BCDiv (Input. 2) Utgangstrrev (Output) retur ((Output) Output. 0) Dette vil bare konvertere fra Base-10 til Base-2 ved hjelp av BCMath (vilkårlig presisjonsberegning). Se også: min BCBin2Dec-funksjon på bindec-dokumentet. Nyt, nitrogen. hei folkens, jeg kjempet for en dag for å få et stort desimalnummer konvertert til binært, på Windows-plattformen. Til slutt med bcmath funksjoner dette er det som jobbet for meg. fikk det til å fungere med bcmath funksjoner, fungerer for 64 bit på 32 bit windows maskin ferdig0 base2 binnenr if (pregmatch (0-9, string)) for (i0 stringchr (i) i) decnri else decnrstring mens (decnrgtbase) mens (bccomp (decnr-base) 1) hvis ((decnr-base) gt0) hvis (bccomp (bcsub (decnr, base). 0) 1) decnrdecnr-base decnrbcsub (decnr, base) binnr.1 basebase2 basebcdiv (base, 2) elseif ((decnr-base) lt0) elseif (bccomp (bcsub (decnr, base) 0) -1) binnr.0 basebase2 basebcdiv (base, 2) elseif ((decnr-base) 0) elseif (bccomp (bcsub (base, 1) 1) binnr.0 basebase2 basebcdiv (base, 2) Her kan du konvertere 64bit i stedet for 32bit med standard decbin lt funksjonen bigdecbin (dec, doublewords1) veldig stille dec2147483648 hvis (restlt0) rest2147483648 erg strpad (decbin (resten), 31,0, STRPADLEFT).erg dec (dec-rest) 2147483648 mens ((decgt0) ampamp (dec1t1)) ) ekkolodt for (i1.52147483647.0-10ilt1.52147483647.010i) ekko DEC:.i. BIN:.bigdecbin (i, 2).ltbrgt echo ltpregt gt ltphp Skriv ut bindecValues ​​(1023) funksjonen bindecValues ​​(desimal. Omvendt false inverse false) 1. Denne funksjonen tar en desimal, konverterer den til binær og returnerer desimalverdiene til hver individuell binær verdi (a 1) i binærstrengen. Du kan bruke større desimalverdier hvis du overfører dem til funksjonen som en streng 2. Den andre valgfrie parameteren reverserer utgangen. 3. Den tredje valgfrie parameteren reverserer den binære strengen, for eksempel 101 blir 010. - darkshad3 ved yahoo dot com bin decbin (desimal) hvis (inverse) bin strreplace (0. x bin) bin strreplace (1. 0. bin) bin strreplace (x. 1. bin) totalt strlen (bin) for (i 0 i lt totalt i) hvis (bin 0) bin2 strpad (bin, total - i. 0) arraypush (lager. bindec (bin2)) revers. rsort (lager): sort (lager) retur implode (,. lager) gt Det trykte resultatet er. 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 Jeg tror dette er den beste funksjonen. Er nesten uendelig (til 250 eller noe) mens (i gt 0) hvis (int - pow (2. i) lt 0) binair 0. binair else binair 1. binair int int - pow (2. i) tall GET nummer Forsiktig prøver binærprofiler med heltall: FFFFFFFF kommando: php - r print (decbin (4294967295).n) resultat: 11111111111111111111111111111111 C3E9CAC8 kommando: php - r print (decbin (3286878920).n) resultat: 11000011111010011100101011001000 uansett spesifisering , bruker bitwise AND: kommando: php - r print ((int) (3286878920 amp 4294967295).n) resultat: -1008088376 (int) nå forventes resultatet (gjett prestasjonspåvirkning) kommandoen: php - r print (bindec (decb (3286878920 amp 4294967295)).) n) Resultat: 3286878920 (flyt) Ytterligere notat: Hvis du bitvis og noen tilfeldige biter med en sekvens på 1-bit av samme lengde, er det forventede resultatet samme tilfeldige bitsekvens uendret. Hvis du vil beholde dette i integerverdenen for raskere sammenligninger, risikerer du å slå opp resultatet for den signerte helhetsbegrensningen. Den maksimale verdien du kan bruke til ønsket resultat er (7FFFFFFF - eller heltall 2147483647), halvparten av det maksimale usignerte 32-biters (plattformavhengige) verdien. Konvertering av streng til binær Opprinnelig postet av hmscott Vil det fungere på multi - tegnstrenger. Beklager, jeg antar at jeg kunne vært litt mer eksplisitt. Jeg utvider data fra en kilde tabell i Oracle til et SQL Server-bord. Oracle er satt som Case-Sensitive, mens SQL ble satt opp til å være Case-Insensitive. For å kunne fylle et bord og beholde riktig PK (fra Oracle), må jeg konvertere kolonnen fra streng til binær (jeg beholder en kopi av den opprinnelige strengen i en egen kolonne). Dermed må jeg ha 50145J i binær og 50145j i binær som forskjellige verdier. Jeg tror ASCII (char) vil bare fungere på en enkelt karakter. Har jeg feil ASCII virker bare med et enkelt tegn om gangen, men det er ingenting som hindrer deg i å påkalle ASCII i en loop for å legge sammen resultater som returneres av den. Du må skille det som vanligvis vises for menneskelig lesbarhet, med faktiske interne data lagringsverdier. Du har nå gjort ting mindre klar (minst for meg). quotBinaryquot beregner ikke i dette tilfellet til min oppfatning av virkeligheten. quotBinary numberquot er en STRING (datatype karakter) av ONES amp NULER På en eller annen måte tror jeg ikke dette er hva du vil planlegge å konstruere. Husk at når tegnstrengen quot50145Jquot er virkelig forsterker virkelig konvertert til BINARY blir det en STRING som er 48 tegn lang Retorisk spørsmål - Hvis både 50145J og 50145j er primære nøkler i en enkelt Oracle-tabell med datatype VARCHAR2, hva vil datatypen av PK i SQL-Server og hvordan vil de to verdiene være forskjellige Jeg vet ikke om noen Oracle-funksjoner for å gjøre dette, kanskje dette kan hjelpe i stedet. Denne funksjonen returnerer den som en ASCII-streng (noe kortere enn en binær representasjon). opprett eller erstatt funksjon toascii (inSource IN VARCHAR2) AS ResultatString varchar2 (381) - 3 mulig kilde kilde begynner for jeg i 1. lengde (inSource) loop ResultatString: ResultString trim (tochar (ascii (substr (inSource. )), 009)) End Loop Return ResultString End Ideelt sett vil du sette den i en pakke og legge til en RESTRICTREFERENCES for å hjelpe Oracle ytelsesmessig. velg toascii (kolonne navn) fra bordet Vennligst ikke send meg direkte med spørsmål. Ive har egentlig nettopp kommet hjem fra puben og kan ikke garantere sunnheten i svarene mine. Faktisk kan jeg ikke tro at jeg faktisk gjorde det hjem.

No comments:

Post a Comment