从二进制文件中读取未签名的长整型文件
read unsigned long from binary file
我正在尝试从二进制文件中读取unsigned long
数字。
我以这种方式执行此操作:
infile.open("file.bin", std::ios::in | std::ios::binary);
char* U=new char[sizeof(unsigned long)];
unsigned long out=0;
infile.read(U, sizeof(unsigned long));
out=static_cast<unsigned long>(*U);
delete[] U;
U=NULL;
infile.close();
但结果不正确。
我的数据是6A F2 6B 58 00 00 00 00
女巫应该被读取为1483469418
但在我的代码中106
出来,这只是数据的第一个字节
问题出在哪里?
如何正确读取文件中的unsigned long
?
这是因为您正在转换一个取消引用的值。 即只有char
而不是完整的 4 个字节。 *U
是106
.
您可以在没有中间缓冲区的情况下读取数据:
infile.read(reinterpret_cast<char*>(&out), sizeof out);
不同之处在于,您在这里重新解释指针,而不是它下面的值。
如果仍然想使用缓冲区,则应*reinterpret_cast<unsigned long*>(U);
,这也将重新解释指针 1st,然后取消引用它。关键是取消引用正确类型的指针。指针的类型确定用于值的字节数。
out=static_cast(U); 应该是 out=(无符号长 *)(U);
它可以简单得多:
infile.open("file.bin", std::ios::in | std::ios::binary);
unsigned long out=0;
infile.read((char *)&out, sizeof(out));
infile.close();
尝试out=*reinterpret_cast<unsigned long *>(U);
<</p>
您需要知道文件(不是程序)是大端序还是小端序。然后用 fgetc() 读取字节并重构数字
所以
unsigned long read32be(FILE *fp)
{
unsigned long ch0, ch1, ch2 ch3;
ch0 = fgetc(fp);
ch1 = fgetc(fp);
ch2 = fgetc(fp);
ch3 = fgetc(fp);
return (unsigned long) (ch0 << 24) | (ch1 << 16) | (ch2 << 8) | ch3
}
现在,无论longs是32位还是64位,big_endian字节序还是小端序,它都可以工作。如果文件是小端序,则交换 fgetc() 的顺序。
可移植地读取二进制文件非常棘手。我已经在 github 上放了一些代码
https://github.com/MalcolmMcLean/ieee754
- C 字符串返回字符串的整数/双精度/长整型值
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- JNI 日期值转换问题,在C++中获取不同的长整型值
- 将长整型值打印为带有前导零的十六进制
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 提升不良词法强制转换:将字符串转换为无符号长整型时,无法将源类型值解释为目标
- 将最小值整数转换为无符号长整型
- 如何将小端格式的QByteArray转换为无符号长整型
- 无符号长整型和无符号 int 之间有什么区别,这 2 种类型应该如何在 c# 中封送?
- 环礁和(长整型)的区别?
- 将逗号格式化为长整型整数
- 如何将长整型传递给 itoa 函数?
- 是否存在将长整型转换为指针有效的情况
- 在 C++ 中创建一对长整型和矢量时出现编译错误
- 当我使用长整型时,我的代码不起作用,它与 int 一起工作得很好
- 将字符串中以十六进制形式存储的负长整型值转换为 C++ 中的长整型变量
- 为什么当我们把变量"u"的数据类型从长整型更改为整型时,模幂会出错?
- 从二进制文件中读取未签名的长整型文件
- C++:长整型不会写入文件
- C++ 从文件中读取字符,转换为长整型