将无符号字符数组转换为长整型C

4

我使用fread将一个长整型数据从二进制文件读入一个无符号字符缓冲区。

现在我想要获取这个长整型数据。我该如何做?

unsigned char buffer[sizeof(long)];

fread(buffer, sizeof(long), 1, my_file);

谢谢!

2个回答

2
当然,您的意思是:
long buffer;
fread(&buffer, sizeof(long), 1, my_file);

1
@nnn 不用谢。我想你可以从中推断出,你可以读取任何类型的变量,而不仅仅是char[]。 - David Heffernan
2
请注意,这仅在生成文件时使用的字节序与您的系统相同时才有效。通常可能会不同(例如,在Motorola CPU上生成的文件在x86上读取)。此外,“long”类型的大小可能不匹配(例如,32位系统与64位系统)。一般来说,您应该指定用于存储“long”的格式(多少字节?哪个是最重要的?)。 - Giuseppe Guerrini
如果long类型使用4个字节存储(假设每个字节有8位),并且你的“long”是32位或更多,一个可移植的转换方式是“long v = b[0]+0x100b[1]+0x10000b[2]+0x1000000*b[3]”。请注意,算术运算符在所有系统上的行为都相同,而面向位的运算符则不同。因此,让编译器以最佳方式优化操作即可。;-) - Giuseppe Guerrini
@David:我只是想指出一些我过去遇到的问题,以及编写(几乎)“可移植”解决方案的方法。“nnn”可能需要使用其自然编码重新导入存储在同一系统上的数据,因此您的解决方案是可以的。再见! - Giuseppe Guerrini
@nnn 如果您对答案感到满意,请点击答案顶部附近的勾号,使其变为绿色,标记为已接受。 - David Heffernan
显示剩余2条评论

0
如果您计划在机器之间传输文件,您需要执行以下操作:
// will swap the byte order in little endian and not in big endian
long transform_standart_byte_order(long in) {
    return (((unsigned long) ((char*) &in)[0] << 56) |
           (((unsigned long) ((char*) &in)[1] << 48) |
           (((unsigned long) ((char*) &in)[2] << 40) |
           (((unsigned long) ((char*) &in)[3] << 32) |
           (((unsigned long) ((char*) &in)[4] << 24) |
           (((unsigned long) ((char*) &in)[5] << 16) |
           (((unsigned long) ((char*) &in)[6] <<  8) |
           (((unsigned long) ((char*) &in)[7]);
}

void write_long(FILE* my_file, long val) {
    val = transform_standart_byte_order(val);
    fwrite(val, sizeof(val), 1, my_file);
}

long read_long(FILE* my_file) {
    long val;
    fread(&val, sizeof(val), 1, my_file);
    return transform_standart_byte_order(val);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接