gpt4 book ai didi

c - 结构中的字节顺序

转载 作者:太空狗 更新时间:2023-10-29 15:05:35 26 4
gpt4 key购买 nike

我对 struct 中字节的排序方式有些困惑。

假设我有以下结构:

struct container {
int myint;
short myshort;
long mylong;
};

现在,我想像下面这样初始化一个 struct container 类型的变量,只是我使用数组来完成。

struct container container1 = {.myint = 0x12345678,
.myshort = 0xABCD,
.mylong = 0x12345678};

假设sizeof intlong4short2

假设没有填充。

那么 struct10 bytes 的布局会怎样?

是否取决于字节顺序?

会不会像:

0x12345678 ABCD 12345678

或喜欢:

0x78563412 CDAB 78563412

我想做的是:我有以下字符数组:

char buffer[10] = {0};

我想用数据手动填充这个数组,然后 memcpystruct

我应该做什么[1]:

buffer[0] = 0x12345678 & 0xFF;
buffer[1] = 0x12345678 >> 8 & 0xFF;
buffer[2] = 0x12345678 >> 16 & 0xFF;
buffer[3] = 0x12345678 >> 24 & 0xFF;
...
buffer[9] = 0x12345678 >> 24 & 0xFF;

或者应该是[2]:

buffer[0] = 0x12345678 >> 24 & 0xFF;
buffer[1] = 0x12345678 >> 16 & 0xFF;
buffer[2] = 0x12345678 >> 8 & 0xFF;
buffer[3] = 0x12345678 & 0xFF;
...
buffer[9] = 0x12345678 & 0xFF;

在我执行 memcpy 之前:

memcpy(&container1, buffer, sizeof(container1);

而且,如果我正在写入一个数组并复制到 struct,它是否可以跨系统移植,尤其是在字节顺序方面?

编辑:[1] 在小端机器上工作而 [2] 在大端机器上工作吗?

最佳答案

Does it depend on the endianness?

是的,它确实取决于机器的字节顺序。所以你的逻辑会根据机器的字节顺序而改变。

由于结构填充,没有可移植的方式*可以做到这一点。尽管不同的编译器确实提供了禁用结构填充的自定义方法。检查Force C++ struct to not be byte aligned .

  • 您可以添加一个 static_assert(需要 C11 支持)以确保您的代码不会被编译,除非您的结构被紧密打包。您不会拥有可移植的代码,但您仍然可以确定,如果您的代码经过编译,它会正确运行。

    static_assert(sizeof(container) == sizeof(int) + sizeof(short) + sizeof(long));

关于c - 结构中的字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33471592/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com