5

我有下面的交流程序,我想以特定的顺序发送一条 32 位消息,例如 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 吗?因为 but[3] 是最后一个字节?有什么我错过的吗?

谢谢!

4

3 回答 3

7

导致它的小端。阅读本文: 字节序

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

于 2012-10-17T22:52:28.187 回答
1

您的系统将数字存储为Little Endians

于 2012-10-17T22:53:21.167 回答
0

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

于 2012-10-17T22:58:58.277 回答