我有一个LabVIEW程序(不是我的),将数据(uint16)保存在这样的二进制文件中:
将数字除以2 ^ 8得到2 uint8(例如320 = 256 + 64)
在保存之前切换数据(因此这里以64开始,以256结尾)
这就是为什么我读4个八位位组得到2个无符号短位的原因
ifstream is("filename", ifstream::binary);
if (is) {
is.seekg(0, is.end);
unsigned char data_char[4];
unsigned short data;
is.seekg(376, is.beg);
is.read(reinterpret_cast<char*>(width), sizeof(width));
// What I tried (switch and convert)
data = data_char[1]<<24 + data_char[0]<<16 + data_char[3]<<8 + data_char[2];
}
例如,值320(uint8)保存在文件中,当我读取data_char时,我有一个带数字的4个组成部分的无符号字符:
[0] = 0'\ 0'
[1] = 64'@'
[2] = 1'\ x1'
[3] = 0'\ 0'
有了256我有:
[0] = 1'\ x1'
[1] = 0'\ 0'
[2] = 0'\ 0'
[3] = 0'\ 0'
[0]和[1]是第一个uint8,[2]和[3]是第二个uint8。
但是,作为C ++的新手,我尝试了一些改动以将char转换为short,但是我做的方式不正确。
我知道对您来说这很容易,但是请您帮我吗?
有关信息,在Python中我只需要做:
sum(struct.unpack(">HH", f.read(4))
最佳答案
要将大字节序转换为本地字节序,只需将字节移位字节的位宽乘以字节位置的差值†和整数大小,然后将所有内容与按位或合并即可。
†更具体地说:第一个字节移位最大,最后一个字节完全不移位。
template<class T>
T my_ntoh(unsigned char* buf) {
const auto s = sizeof(T);
T value = 0;
for (unsigned i = 0; i < s; i++)
value |= buf[i] << CHAR_BIT * (s - 1 - i);
return value;
}
该模板可以使用任何大小的整数,并且读取的字节数与整数类型的大小一样多。
如果可以依靠POSIX,则它提供
ntohs
,因此您不必自己编写此转换。由于您想读取两个大端无符号短裤并将它们加在一起(我使用
uint16_t
,因为它保证为2个八位位组):auto part1 = my_ntoh<uint16_t>(data_char);
auto part2 = my_ntoh<uint16_t>(data_char + sizeof part1);
data = part1 + part2;
关于c++ - 将无符号字符转换为无符号短(大端),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48463778/