为什么输出看起来像这样?

时间:2012-10-17 22:49:06

标签: c struct bit-manipulation

我下面有一个c程序,我想以特定的顺序发送一个32位的消息Eg.0x00000001。

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

然后我通过打印char数组中的值来测试它。我在上面的评论中得到了输出。输出不应该是0 0和0 1吗?既然但[3]是最后一个字节?我错过了什么吗?

谢谢!

3 个答案:

答案 0 :(得分:7)

导致它的小端。读这个: Endianness

要将它们转换为网络顺序,您必须使用htonl(主机到网络长)和htons(主机到网络短)转换功能。收到后,您需要使用ntohlntohs函数将网络转换为主机订单。字节放在数组中的顺序取决于将它们放入内存的方式。如果将它们作为四个单独的短字节放置,则将省略字节顺序转换。您可以使用char类型进行此类原始字节操作。

答案 1 :(得分:1)

您的系统将号码存储为Little Endians

答案 2 :(得分:0)

Windows将数据保留为“小端”,因此字节相反。 有关详细信息,请参阅Endiannes