我有一个LabVIEW程序(不是我的),将数据(uint16)保存在这样的二进制文件中:
c++ - 将无符号字符转换为无符号短(大端)-LMLPHP


将数字除以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/

10-16 05:16