2012-10-17 3 views
5

Ho un programma c di seguito, vorrei inviare un messaggio a 32 bit in un ordine particolare Eg.0x00000001.Perché l'output è simile a questo?

#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; 
} 

Quindi lo provo stampando i valori nel char array. Ho ottenuto risultati nei commenti sopra. Non dovrebbe l'output essere 0 0 e 0 1? poiché but [3] è l'ultimo byte? C'è qualcosa che mi è mancato?

Grazie!

risposta

7

Causa il suo piccolo endian. Leggi questo: Endianness

Per traducendoli in ordine di rete, è necessario utilizzare htonl (host-to-network-lungo) htons (host-to-network-breve) le funzioni di traduzione e. Dopo aver ricevuto, è necessario utilizzare le funzioni ntohl e ntohs per convertire da ordine di rete a host. L'ordine in cui i tuoi byte sono posizionati nell'array dipende dal modo in cui li hai messi in memoria. Se li metti come quattro byte brevi separati, ometti la conversione di endianness. È possibile utilizzare il tipo char per questo tipo di manipolazioni di byte non elaborati.

+0

quindi come appare il messaggio quando invio utilizzando sendto() da socket.h? Sarà 0x00000001 o 0x00000100? – kun

+0

@cjk: è necessario utilizzare 'htons' per l'invio, risparmia sapere l'esattezza esatta per te. – Vlad

0

di Windows mantiene i dati come "Little Endian" in modo che i byte sono invertiti. Vedere Endiannes per maggiori informazioni.