Nel tentativo di migliorare la mia conoscenza del formato di file STFS utilizzando un programma per leggere tutti i diversi bit di informazioni. Utilizzando un sito web con un riferimento di cui offset contengono le informazioni, ho scritto un codice che dispone di un lettore binario passare attraverso il file e inserire i valori nelle variabili corrette. Il problema è che tutti i dati dovrebbe essere Big Endian, e tutto ciò che il lettore binario leggere è Little Endian. Così, che cosa è il modo migliore per andare su come correggere questo Posso creare una classe mimica di lettore di binario che restituisce una matrice inversa di byte C'è qualcosa che posso cambiare in istanza di classe che renderà più letta in big endian così non devo riscrivere tutto Ogni aiuto è apprezzato. Edit: Ho provato ad aggiungere Encoding. BigEndianUnicode come parametro, ma si legge ancora little endian. A mio parere, si vuole stare attenti a fare questo. La ragione per cui uno vorrebbe Convertire da BigEndian a LittleEndian è se i byte vengono letti sono in BigEndian e il sistema operativo calcolo contro di loro sta operando in LittleEndian. C è neanche una finestra unica lingua più. Con porti come Mono, e anche altre piattaforme Microsoft come Windows Phone 78, Xbox 360Xbox One, Windwos CE, Windows 8 Mobile, Linux con MONO, Apple con MONO, ecc E 'del tutto possibile la piattaforma operativa potrebbe essere in BigEndian, in cui caso youd essere avvitamento te se convertito il codice senza fare alcun controllo. Il BitConverter ha già un campo su di esso chiamato IsLittleEndian è possibile utilizzare questo per determinare se l'ambiente operativo è in LittleEndian o no. Poi si può fare l'inversione condizionale. In quanto tale, in realtà ho appena scritto alcune estensioni di byte invece di fare un grande classe: Quindi immaginare questo codice di esempio: risposta 6 febbraio 14 a 7:39 tua risposta 2017 Stack Exchange, IncWhen trasferimento di interi binari su una rete, è importante garantire che i sistemi di invio e la ricezione utilizzano lo stesso formato o che una conversione è fatta. Se un computer Big Endian ha inviato il numero binario sopra a un computer endian Poco senza conversione, sarebbe stato interpretato come 513. Per evitare problemi in una rete eterogenea, numeri binari vengono convertiti in Rete formato standard (big endian) prima della trasmissione. Le funzioni: htons Host alla rete Breve htonl Host alla rete lungo può essere utilizzato per convertire i dati binari alla rete formato standard. Nota storica: I nomi Big Endian e Little Endian provengono da Rondoni romanzo Gullivers Travels. In questa storia i lillipuziani sono stati divisi nelle grandi endians e le Piccole endians in base a quale estremità di un uovo sodo che credevano dovrebbe essere opened. I hanno provato a cercare in giro, ma non sono stati in grado di trovare molto di letterali binari e endianness. Sono letterali binari little-endian, big-endian o qualcos'altro (come corrispondente alla piattaforma di destinazione) A titolo di esempio, qual è il valore decimale di 0b0111. E '7 piattaforma specifica Un'altra cosa Edit: ho preso una brutta valore di 7 dal momento che è rappresentata all'interno di un byte. La domanda è stata sufficientemente risposto nonostante questo fatto. Alcuni retroscena: Fondamentalmente Im cercando di capire quale sia il valore dei bit meno significativi sono, e mascherarlo con letterali binari sembrava un buon modo per andare. ma solo se vi è una certa garanzia circa endianness. chiesto 18 dicembre 14 alle 16:21 Cubic: Naturalmente letterali decimali hanno endianness. That39s perché 7x3 è 21 e non 12. Ogni sequenza ordinata di cifre, a prescindere dalla base ha un endianness. Dal momento che l'ordine può essere crescente o decrescente, there39s naturalmente big-endian e little-endian. (Quotmiddle-endianquot sono quelli strani 3412 sequenze non ordinate) ndash MSalters 18 dicembre 14 alle 17:44 Endianness non è mai esposto direttamente nel codice a meno che davvero cercare di farlo uscire (come l'utilizzo di trucchi puntatore). 0b0111 è 7, le sue stesse regole come esadecimale, la scrittura non significa 0x77AA su alcune piattaforme perché sarebbe assurdo. Dove sarebbero gli 0 in più che mancano andare comunque avrebbero ottengono imbottito sulla parte anteriore, poi il tutto capovolto, o sarebbe ottengono aggiunti dopo non ho idea di quello che qualcuno si aspetterebbe se questo fosse il caso. Il punto è che C non rende alcuna ipotesi circa la endianness della macchina, se si scrive codice usando le primitive ed i letterali che fornisce, il comportamento sarà lo stesso da macchina a macchina (a meno che non si avvia eludere il sistema di tipo, che si può bisogno di fare) per affrontare l'aggiornamento: il numero sarà il modo in cui si scrive fuori. I bit non vengono riordinati o alcunché di simile, il bit più significativo è sulla sinistra e il bit meno significativo è sulla destra. Sembra che ci sia un malinteso su ciò che è endianness. Endianness si riferisce a come i byte sono ordinate in memoria e come devono essere interpretato. Se ti ho dato il numero 4172 e ha detto se questo è quattromila al cento settantadue, qual è il endianness non puoi davvero dare una risposta perché la questione doesnt ha senso. (Si potrebbe sostenere che il più grande cifra a sinistra significa big endian, ma Id d'accordo che questo è valido). Questo è solo un numero, non ci sono byte di interpretare, non ci sono indirizzi di memoria. Supponendo 4 byte rappresentazione intera, i byte che corrispondono ad esso sono: così, dato uno di questi e hanno detto che questo è il computer rappresentazione interna di 4172 è possibile determinare se il suo piccolo o grande endian. Così ora prendere in considerazione la tua 0b0111 letterale binario questi 4 bit rappresentano un nybble, e possono essere memorizzati come sia Ma non dovete preoccuparsi, perché questo è anche gestito dal hardware, il linguaggio impone che il compilatore legge da sinistra a destra, bit più significativo a meno significativo Endianness po 'non si tratta di singoli bit. Dato che un byte è di 8 bit, se porgo 0b00000111 e dico è questo piccolo o grande endian ancora non puoi dire perché hai solo un byte. Endianness bit pretende di riordino in un byte, si riferisce al riordino di interi byte (a meno che naturalmente si dispone di un bit byte). Non dovete preoccuparsi di ciò che il computer sta utilizzando internamente. 0b0111 solo consente di risparmiare il tempo di dover scrivere cose del genere senza bisogno di commento che spiega il significato del numero. Vorrei far notare che ad un sufficientemente basso livello di programmazione non si può evitare endianness perché le specifiche di ciò che si sta implementando mandato i loro ingressi o uscite di essere in littlebigwhatever endian. Che include i protocolli di rete, algoritmi di crittografia, e così via. Solo perché si don39t fare queste cose doesn39t significano che don39t esistono, e endianness fa fuoriuscire dal bel sistema di tipo confortevole in queste situazioni. Così il quottoo intelligente per la propria parte goodquot sembra ingiustificato. ndash Thomas 19 dicembre 14 a 2:37 RyanHaining Utilizzando il htons dal tuo commento: che è facile da implementare senza fare alcuna ipotesi circa endianness: uint16t htons (uint16t x) Si fa fare alcune ipotesi circa la rappresentazione di uint16t. ma endianness non è uno di tali presupposti, e almeno clang ottimizzare molto bene. Sono d'accordo con il commento che le persone dovrebbero essere generalmente la scrittura di codice che non fa ipotesi circa endianness, non è solo necessario. ndash HVD 19-dic-14 a 8:55 Tutti i letterali interi, compresi quelli binari sono interpretate allo stesso modo dato che normalmente leggere i numeri (a sinistra cifra più essere più significativo). Lo standard C garantisce la stessa interpretazione di letterali senza dover essere interessati con l'ambiente specifico sei su. Così, non dovete preoccuparvi di endianness in questo contesto. Il tuo esempio di 0b0111 è sempre uguale a sette. I C standard uso doesnt termini di endianness per quanto riguarda il numero letterali. Piuttosto, descrive semplicemente che letterali hanno una coerente interpretazione, e che l'interpretazione è quella che ci si aspetterebbe. C standard - Integer letterali - 2.14.2 - comma 1 Un numero intero letterale è una sequenza di cifre che non ha periodo o parte esponente, con separazione virgolette singole opzionali che vengono ignorati nel determinare il suo valore. Un numero intero letterale può avere un prefisso che specifica la sua base e un suffisso che specifica il tipo. Il lessicalmente prima cifra della sequenza di cifre è il più significativo. Un intero binario letterale (base due) inizia con 0b o 0B e consiste di una sequenza di cifre binarie. Un numero intero ottale letterale (base otto) inizia con la cifra 0 e consiste di una sequenza di cifre ottali. Un intero decimale letterale (base dieci) inizia con una cifra diversa da 0 e consiste di una sequenza di cifre decimali. Un numero intero esadecimale letterale (base sedici) inizia con 0x o 0X ed è costituito da una sequenza di cifre esadecimali, che includono le cifre decimali e le lettere da A a F e valori da A a F con decimale dieci a quindici. Esempio: Il numero dodici può essere scritto 12, 014, 0xC o 0b1100. I letterali 1048576, 1048576, 0x100000, 0x100000, e 0.004 milioni hanno tutti lo stesso valore. Fine esempio Wikipedia descrive ciò che è endianness, ed utilizza il nostro sistema di numero come un esempio per capire big-endian. I termini e le endian endian si riferiscono alla convenzione usata per interpretare i byte che compongono una parola di dati quando questi byte sono memorizzati nella memoria del computer. sistemi Big-endian memorizzano il byte più significativo di una parola nell'indirizzo più piccolo e il byte meno significativo è memorizzato nella grande indirizzo (vedi anche bit più significativo). sistemi little-endian, al contrario, conservare il byte meno significativo nell'indirizzo più piccolo. Un esempio su endianness è quello di pensare a come un numero decimale è scritto e letto in notazione posizionale. Assumendo un sistema di scrittura in cui numeri sono scritti da sinistra a destra, la posizione più a sinistra è analogo all'indirizzo più piccola di memoria utilizzata, e la posizione più a destra il più grande. Ad esempio, il numero cento ventina tre è scritto 1 2 3, con le centinaia posto più a sinistra. Chiunque legga anche questo numero sa che la cifra più a sinistra ha il più grande valore di luogo. Questo è un esempio di un big-endian convenzione seguita nella vita quotidiana. In questo contesto, stiamo considerando una cifra di un numero intero letterale essere un byte di una parola, e la parola di essere letterale stesso. Inoltre, il carattere più a sinistra in un letterale è considerato di avere l'indirizzo più piccolo. Con letterale 1234. quello cifre, due, tre e quattro sono i byte di una parola, e 1234 è la parola. Con il 0b0111 letterale binario. le cifre zero, uno, uno e uno sono i byte di una parola, e la parola è 0111. Questa considerazione ci permette di capire endianness nel contesto del linguaggio C, e mostra che letterali interi sono simili a big-endian. cmaster più piccolo indirizzo lasciato prima. Naturalmente noi di solito don39t usare il endianness termine per archi numero a tutti, e solo per il layout in memoria. Così si può neanche dire che il termine quotendiannessquot non si applica ai letterali a tutti, o che they39re sempre bigEndian. Dire che sono letterali sono sempre little endian è sicuramente sbagliato. ndash CodesInChaos 18 dicembre 14 a 17:22 Youre manca la distinzione tra endianness come scritto nel codice sorgente e endianness come rappresentato in codice oggetto. La risposta per ogni sorprende: letterali del codice sorgente sono bigEndian perché questo è come gli esseri umani li leggerà, in codice oggetto theyre scritti però il bersaglio li legge. Dal momento che un byte è, per definizione, la più piccola unità di accesso alla memoria Io non credo che sarebbe possibile attribuire anche un endianness a qualsiasi rappresentazione interna di bit in un byte - l'unico modo per scoprire endianness per i numeri più grandi (intenzionalmente o di sorpresa ) è da loro accesso da tratti di stoccaggio, e il byte è, per definizione, l'unità di memorizzazione accessibili più piccola. risposto 18 Dicembre 14 at 17:58 Hurkyl esattamente. È can39t dire se i registri della macchina sono bigEndian o no, perché quelli non sono mai esposti - there39s nessuna ragione al mondo per esporre qualsiasi endianness ma bigendianness nei registri, perché il punto di littlendian era la compatibilità con i dati soda-paglia 8bit autobus per storage esterno o dispositivi. ndash jthill 18 dicembre 14 a 18:23 Le lingue CC non si preoccupano per endianness di interi multi-byte. compilatori CC fanno. I compilatori analizzare il codice sorgente e generare codice macchina per la piattaforma di destinazione specifica. Il compilatore, in generale, negozi integer letterali stesso modo memorizza un numero tale che le istruzioni CPU bersaglio sosterrà direttamente lettura e scrittura in memoria. Il compilatore si prende cura delle differenze tra le piattaforme di destinazione in modo da non dovete. L'unica volta che è necessario preoccuparsi di endianness è quando si condividono i valori binari con altri sistemi che hanno byte diverso ordering. Then si sarebbe leggere i dati binari in, byte per byte, e disporre i byte in memoria nell'ordine corretto per il sistema che il codice è in esecuzione. risposto 18 dicembre 14 a 17:22 TheronWGenaux: Haha, che uno deve essere stato divertente per eseguire il debug Sì, il default processori x86 a simulare la lettura non allineati, che funziona (anche se lentamente) lo stesso codice su un altro processore genererà un errore di bus. Questo è divertente quando you39re codifica e test su x86, quindi la distribuzione di un (per esempio incorporato) CPU diversa. ndash psmears 19 dicembre 14 alle 18:40 Si potrebbe desiderare di pensare a C o C o qualsiasi altro linguaggio come intrinsecamente little endian (pensare a come il operatori bit a bit di lavoro). Se la HW sottostante è big endian, il compilatore garantisce che i dati sono memorizzati in big endian (idem per altri endian), tuttavia le operazioni di saggi bit funzionano come se i dati sono little endian. Cosa da ricordare è che per quanto riguarda la lingua è interessato, i dati sono in little endian. problemi connessi endianness sorgono quando si esegue il cast i dati da un tipo all'altro. Finché tu non fai che sei bravo. Sono stato interrogato sulla lingua CC dichiarazione ad essere intrinsecamente little endian, in quanto tale, io sto fornendo un esempio che molti sanno come funziona, ma bene qui vado. Uscita su un sistema endian po ': uscita su un grande sistema di endian: Quindi, se non si conosce il endianness processori. da dove viene tutto viene fuori proprio nel piccolo sistema endian Quindi, io dico che la lingua CC è intrinsecamente little endian. risposto 18 dicembre 14 a 18:17 I commenti non sono in discussione estesa questa conversazione è stata spostata a chiacchierare. ndash bluefeet 9830 19 14 dicembre alle 1:25 si potrebbe scrivere un assegno simile in un linguaggio assembly o qualsiasi altra lingua che ha puntatori. Quindi, questo codice dimostra solo che quotlittle-endian è più naturale di big-endianquot questo doesn39t si riferiscono specificatamente a CC. Inoltre, questo non ha assolutamente nulla a che fare con letterali binari nella questione. ndash anatolyg 21 dicembre 14 alle 10:35
Il tuo Opzioni Binarie sociale T rading RETE TRADE4.ME non è di proprietà da un broker di opzioni binarie. Trade4.me è di proprietà e gestito da SAS NEUTRINO, una società di servizi finanziari indipendente registrato in Francia. SAS NEUTRINO si trova a 28 Venelle de Kérivin, 29200 Brest, Francia. Tutti i commenti presentati sono opinioni personali. Si prega di notare che il commercio in qualsiasi mercato comporta un rischio e trading di opzioni binarie comporta un rischio sostanziale di perdita che potrebbe non essere adatto per voi. Se si decide di operare in questi mercati vi chiediamo di considerare con attenzione i vostri obiettivi commerciali, esperienza e propensione al rischio. Gli scambi di opzioni binarie comporta un alto livello di rischio e può provocare la perdita di tutto il capitale investito. come tale, opzioni binarie potrebbe non essere adatto a tutti gli investitori. Non si dovrebbe investire denaro che non può permettersi di perdere. Prima di decidere di commercio, s...
Comments
Post a Comment