gpt4 book ai didi

将 Little Endian 转换为 Big Endian

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

我只是想问一下我的方法从小端到大端的转换是否正确,只是为了确定我是否理解其中的区别。

我有一个数字存储在小端,这里是数字的二进制和十六进制表示:

‭0001 0010 0011 0100 0101 0110 0111 1000‬

‭12345678‬

在大端格式中,我认为应该交换字节,如下所示:

1000 0111 0110 0101 0100 0011 0010 0001

‭87654321

这是正确的吗?

此外,下面的代码尝试这样做但失败了。有什么明显的错误或者我可以优化一些东西吗?如果代码不适合此转换,您能否解释原因并展示执行相同转换的更好方法?

uint32_t num = 0x12345678;
uint32_t b0,b1,b2,b3,b4,b5,b6,b7;
uint32_t res = 0;

b0 = (num & 0xf) << 28;
b1 = (num & 0xf0) << 24;
b2 = (num & 0xf00) << 20;
b3 = (num & 0xf000) << 16;
b4 = (num & 0xf0000) << 12;
b5 = (num & 0xf00000) << 8;
b6 = (num & 0xf000000) << 4;
b7 = (num & 0xf0000000) << 4;

res = b0 + b1 + b2 + b3 + b4 + b5 + b6 + b7;

printf("%d\n", res);

最佳答案

OP 的示例代码不正确。

Endian 转换在位和 8 位字节级别进行。大多数端序问题都涉及字节级别。 OP 的代码正在 4 位半字节级别进行字节序更改。推荐:

// Swap endian (big to little) or (little to big)
uint32_t num = 9;
uint32_t b0,b1,b2,b3;
uint32_t res;

b0 = (num & 0x000000ff) << 24u;
b1 = (num & 0x0000ff00) << 8u;
b2 = (num & 0x00ff0000) >> 8u;
b3 = (num & 0xff000000) >> 24u;

res = b0 | b1 | b2 | b3;

printf("%" PRIX32 "\n", res);

如果性能真的很重要,则需要知道特定的处理器。否则,将其留给编译器。

[编辑] OP 添加了一条更改内容的评论。
“用16进制表示的32位数值(st uv wx yz)记录在一个四字节字段中为(st uv wx yz)。”

出现在这种情况下,32 位数字的字节序是未知,结果需要以 字节序存储在内存中。

uint32_t num = 9;
uint8_t b[4];
b[0] = (uint8_t) (num >> 0u);
b[1] = (uint8_t) (num >> 8u);
b[2] = (uint8_t) (num >> 16u);
b[3] = (uint8_t) (num >> 24u);

[2016 年编辑] 简化

... The type of the result is that of the promoted left operand.... Bitwise shift operators C11 §6.5.7 3

shift 常量(右操作数)后使用 u 与不使用它的结果相同。

b3 = (num & 0xff000000) >> 24u;
b[3] = (uint8_t) (num >> 24u);
// same as
b3 = (num & 0xff000000) >> 24;
b[3] = (uint8_t) (num >> 24);

关于将 Little Endian 转换为 Big Endian,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19275955/

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