2012-10-17 10 views
5

Ich habe ein c-Programm unten, ich möchte eine 32-Bit-Nachricht in einer bestimmten Reihenfolge senden Eg.0x00000001.Warum sieht die Ausgabe so aus?

#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 
#include <stdint.h> 

struct test 
{ 
    uint16_t a; 
    uint16_t b; 
}; 

int main(int argc, char const *argv[]) 
{ 
    char buf[4]; 
    struct test* ptr=(struct test*)buf; 
    ptr->a=0x0000; 
    ptr->b=0x0001; 
    printf("%x %x\n",buf[0],buf[1]); //output is 0 0 
    printf("%x %x\n",buf[2],buf[3]); //output is 1 0 
    return 0; 
} 

Dann teste ich es durch Ausdrucken der Werte in Char-Array. Ich habe in den obigen Kommentaren ausgegeben. Sollte der Ausgang nicht 0 0 und 0 1 sein? seit aber [3] ist das letzte Byte? Gibt es etwas, was ich vermisst habe?

Danke!

Antwort

7

Ursache seiner kleinen Endian. Lesen Sie dazu: Endianness

Für sie in das Netzwerk, um zu übersetzen, müssen Sie htonl (Host-zu-Netzwerk-lang) und htons (Host-zu-Netzwerk-short) übersetzen Funktionen nutzen. Nachdem Sie empfangen haben, müssen Sie die Funktionen ntohl und ntohs verwenden, um vom Netzwerk in die Host-Reihenfolge zu konvertieren. Die Reihenfolge, in der Ihre Bytes im Array abgelegt werden, hängt davon ab, wie Sie sie in den Speicher geladen haben. Wenn Sie sie als vier separate kurze Bytes setzen, werden Sie die Endianness-Konvertierung auslassen. Sie können den Typ char für diese Art von rohen Byte-Manipulationen verwenden.

+0

also wie sieht die Nachricht aus, wenn ich sendto() von socket.h aussende? Es wird 0x00000001 oder 0x00000100 sein? – kun

+0

@cjk: Sie müssen 'htons' zum Senden verwenden, es erspart Ihnen die genaue Endianness für Sie. – Vlad

0

Windows die Daten als "Little-Endian" so der Bytes umgekehrt hält. Weitere Informationen finden Sie unter Endiannes.

Verwandte Themen