gpt4 book ai didi

C 40 位字节交换(endian)

转载 作者:行者123 更新时间:2023-12-02 07:22:55 27 4
gpt4 key购买 nike

我正在使用 C 和来自 byteswap 的 bswap_{16,32,64} 宏从 big-endian 读取/写入 little-endian 格式的二进制文件。 h 用于字节交换。

除 40 位的位字段外,所有值均已正确读取和写入。

bswap_40 宏不存在,我不知道该怎么做,或者是否有更好的解决方案。

这是一个显示这个问题的小代码:

#include <stdio.h>
#include <inttypes.h>
#include <byteswap.h>

#define bswap_40(x) bswap_64(x)

struct tIndex {
uint64_t val_64;
uint64_t val_40:40;
} s1 = { 5294967296, 5294967296 };

int main(void)
{
// write swapped values
struct tIndex s2 = { bswap_64(s1.val_64), bswap_40(s1.val_40) };
FILE *fp = fopen("index.bin", "w");
fwrite(&s2, sizeof(s2), 1, fp);
fclose(fp);

// read swapped values
struct tIndex s3;
fp = fopen("index.bin", "r");
fread(&s3, sizeof(s3), 1, fp);
fclose(fp);
s3.val_64 = bswap_64(s3.val_64);
s3.val_40 = bswap_40(s3.val_40);

printf("val_64: %" PRIu64 " -> %s\n", s3.val_64, (s1.val_64 == s3.val_64 ? "OK" : "Error"));
printf("val_40: %" PRIu64 " -> %s\n", s3.val_40, (s1.val_40 == s3.val_40 ? "OK" : "Error"));

return 0;
}

该代码编译为:

gcc -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE swap_40.c -o swap_40

如何定义 bswap_40 宏来读写这些 40 位的值以进行字节交换?

最佳答案

通过将 bswap_40 定义为与 bswap_64 相同,您将交换 8 个字节而不是 5 个字节。因此,如果您以此开头:

00 00 00 01 02 03 04 05

你最终得到这个:

05 04 03 02 01 00 00 00

取而代之的是:

00 00 00 05 04 03 02 01

处理此问题的最简单方法是获取 bswap_64 的结果并将其右移 24:

#define bswap_40(x) (bswap_64(x) >> 24)

关于C 40 位字节交换(endian),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38082191/

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