gpt4 book ai didi

将大端转换为小端的 C/C++ 代码

转载 作者:太空宇宙 更新时间:2023-11-04 01:20:20 25 4
gpt4 key购买 nike

我见过几个不同的代码示例,可以将大端字节序转换为小端字节序,反之亦然,但我遇到了一段有人编写的代码,似乎可以工作,但我我很困惑为什么会这样。

基本上,有一个 char 缓冲区,在某个位置包含一个 4 字节的 int 存储为 big-endian。该代码将提取整数并将其存储为本地小端。这是一个简短的例子:

char test[8] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
char *ptr = test;
int32_t value = 0;
value = ((*ptr) & 0xFF) << 24;
value |= ((*(ptr + 1)) & 0xFF) << 16;
value |= ((*(ptr + 2)) & 0xFF) << 8;
value |= (*(ptr + 3)) & 0xFF;
printf("value: %d\n", value);

值:66051

上面的代码取前四个字节,将其存储为小端,并打印结果。任何人都可以逐步解释这是如何工作的吗?我很困惑为什么 ((*ptr) & 0xFF) << X 不会对任何 X >= 8 计算为 0。

最佳答案

此代码正在构造值,一次一个字节。

首先它捕获最低字节

 (*ptr) & 0xFF

然后移到最高位

 ((*ptr) & 0xFF) << 24

然后将其赋值给之前初始化为0的值。

 value =((*ptr) & 0xFF) << 24

现在“魔法”开始发挥作用了。由于 ptr 值被声明为 char*,因此向其添加 1 会使指针前进一个字符。

 (ptr + 1) /* the next character address */
*(ptr + 1) /* the next character */

在你看到他们使用指针数学来更新相对起始地址之后,其余操作与已经描述的相同,只是为了保留部分移位的值,他们 将值放入现有的 value 变量中

 value |= ((*(ptr + 1)) & 0xFF) << 16

请注意,指针数学是您可以执行类似操作的原因

 char* ptr = ... some value ...

while (*ptr != 0) {
... do something ...
ptr++;
}

但它的代价是可能会弄乱您的指针地址,从而大大增加您违反 SEGFAULT 的风险。一些语言认为这是一个问题,他们删除了进行指针数学运算的能力。不能对其进行指针数学运算的准指针通常称为引用。

关于将大端转换为小端的 C/C++ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45307516/

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