2009-05-20 15 views
5

Verzeihen Sie mir, wenn das schon einmal gefragt wurde, aber ich versichere Ihnen, ich habe das Internet durchforstet und nichts gefunden, wahrscheinlich weil ich nicht die richtige Terminologie habe. (?)Codierung von ... einer Art?

Ich möchte eine ganze Zahl nehmen und wandeln es in ein Little-Endian-Hex-Darstellung wie folgt aus:

303 -> 0x2f010000

Ich kann sehen, dass die Bytes so gepackt sind, dass die Die Plätze von 16 und 1 befinden sich beide im selben Byte, und der Platz von 4096 und der Platz von 256 teilen sich ein Byte. Wenn mich jemand auf die richtige Terminologie für eine solche Kodierung hinweisen könnte, bin ich sicher, dass ich meine Antwort darauf finden könnte. Vielen Dank!

+0

Suchen Sie eine Funktion wie ein dec2hex? Viele Sprachen verfügen über Funktionen zum Konvertieren einer dezimalen in eine hexadezimale Darstellung. – Kekoa

+3

+1 für möglicherweise die höflichste Frage, die ich jemals auf SO gesehen habe. :-) –

+0

Konvertieren direkt in Hex ist kein Problem - Wie im Beispiel kann ich 303 in 12f mit einer Hex-Konvertierung konvertieren. Was ich brauche, ist die Codierung mit einem Byte, um jedes Paar von Hexadezimalstellen zu halten, wenn das Sinn macht. – Blumer

Antwort

2

Verwendung Bit Shift-Operatoren verknüpft mit dem bitweisen Operatoren AND und OR ...

unter der Annahme, 32 Bit ohne Vorzeichen:

int value = 303; 
int result = 0x00000000; 

for (int i = 0; i < 4; i++) 
{ 
    result = result | ((value & (0xFF << (i * 8))) << (24 - (i * 8))); 
} 
+0

Danke, Demi. Ich glaube nicht, dass dies genau das war, was ich brauchte, aber wahrscheinlich mehr, weil ich das Problem nicht vollständig beschrieben habe. – Blumer

+0

@Blumer: Ihr Code-Snippet in VB tut im Wesentlichen die gleiche Sache, nur mit einer etwas anderen Reihenfolge der Operationen und mit ganzzahligen Division anstelle von Bit-Operationen. Sie tauschen im Wesentlichen Byte 0 mit Byte 3 und Byte 1 mit Byte 2 aus – Demi

2

Big-Endian und Little-Endian beziehen sich auf die Reihenfolge der Bytes im Speicher . Ein Wert wie 0x2f100000 hat keine intrinsische Endianness, die Endianess hängt von der CPU-Architektur ab.

Wenn Sie die Reihenfolge der Bytes in einem 32-Bit-Wert immer ändern möchten, verwenden Sie den Code, den Demi veröffentlicht hat.

Wenn Sie immer die spezifische Byte-Reihenfolge erhalten möchten (weil Sie sich darauf vorbereiten, diese Bytes über das Netzwerk zu übertragen oder sie in einer Festplattendatei zu speichern), verwenden Sie etwas anderes. Z.B. Die BSD-Sockets-Bibliothek hat eine Funktion htonl(), die den nativen 32-Bit-Wert Ihrer CPU übernimmt und in Big-Endian-Reihenfolge bringt.

Wenn Sie auf einer Little-Endian-Maschine laufen, htonl (303) == 0x2f100000. Wenn Sie auf einer Big-Endian-Maschine laufen, wird htonl (303) == 303 angezeigt. In beiden Fällen wird das Ergebnis durch die Bytes [0x00, 0x00, 0x01, 0x2f] im Speicher dargestellt.

0

Wenn jemand einen bestimmten Begriff zu dem hinzufügen kann, was ich versuchte, würde ich es immer noch gerne hören. Ich habe jedoch einen Weg gefunden, zu tun, was ich brauchte, und ich werde es hier veröffentlichen. Wenn jemand auf mich aufpasst, können sie es finden. Es sein kann (wahrscheinlich) ein einfacher, direkter Weg, es zu tun, aber hier ist, was ich tun, in VB.Net landete, um den Bytecode wieder ich wollte:

Private Function Encode(ByVal original As Integer) as Byte()  
    Dim twofiftysixes As Integer = CInt(Math.Floor(original/256)) 
    Dim sixteens As Integer = CInt(Math.Floor((original - (256 * twofiftysixes))/16)) 
    Dim ones As Integer = original Mod 16 
    Dim bytecode As Byte() = {CByte((16 * sixteens) + ones), CByte(twofiftysixes), 0, 0} 
    Return bytecode 
End Function 

effektiv die ganze Zahl Zerschlagung in ihre hex-Komponenten und konvertiert dann die entsprechenden Paare in cBytes.