【发布时间】:2018-01-26 14:51:33
【问题描述】:
我有一个 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 时,我有一个 unsigned 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] 是第二个。
但是,作为 C++ 的新手,我尝试了一些移位来将 char 转换为 short,但我的方法不正确。
我知道这对你来说很容易,但请你帮助我吗?
有关信息,我只需要在 Python 中执行以下操作:sum(struct.unpack(">HH", f.read(4))
【问题讨论】:
-
我建议使用
htons()/ntohs()来做到这一点。 -
你不是自己写答案
data_char[2]*256 + data_char[1]吗?您不必通过位移来完成。 -
是的,但是这个解决方案承认我的数据总是在我的 char 的 2d 和 3th 索引上。所以它不是通用的。我说这是因为在我必须以 little endian 和 uint16 读取其他数据之后,所以我必须先了解基础;)
-
嗯,答案总是
second_byte*256 + first_byte。这是普遍的。 -
好吧,例如,256 将是 1、0、0、0。如果我按照你的建议做,我会找到 0。
标签: c++ type-conversion