问题描述
我编写了这个程序来将字符转换为短:
typedef unsigned char u8;
typedef unsigned short u16;
u16 combine2bytes(u8 a,u8 b) {
return b | (a << 8);
}
int main()
{
std::vector<char> cVec{ 'a','r','t','u' };
std::vector<short>svec;
for (auto i = 0; i < cVec.size(); i+=2)
{
svec.push_back(combine2bytes(cVec.at(i),cVec.at(i+1)));
}
std::cout << svec.size() << '\n';
for (auto i = 0; i < svec.size(); i++)
std::cout << svec.at(i) << '\n';
return 0;
}
因此,如果我理解,如果我们有一个 1 字节数据的向量(或数组),并且我想从该 1 字节向量创建一个 2 字节向量,我必须从该 1 字节中读取 2 个字节向量?这样对吗? float 和 int 也是如此;我们必须连续读取 4 个字节?
F0 5A 6B A9 4C E3 etc..
假设现在我想将其转换为short,所以我必须采用:F0 and 5A
但哪个是LSB 和MSB(注意:结构是小端)?
如果我必须将它转换为浮点数:如何转换它以便获得浮点数?因为如果我将它转换为浮点数,它与我将它转换为 int 相似?如何获得浮点数?
提前致谢
解决方法
它所依赖的著名答案适合这里。
-
MSB/LSB:这取决于您如何存储这些字节,例如,如果您将 MSB 存储在矢量 case 0 中,那么在读取时您应该考虑这一点。如果您没有这些信息,您将无法猜测。
-
数据类型:这取决于您在那里存储的数据。例如,如果它是一个浮点数,那么只需进行位移位然后进行转换,您可以通过一个具体的例子来尝试。但是,如果是另一个程序编写了这些字节,或者它们不是在同一架构上编写的,那么您应该有一个协议来定义哪些字节用于尾数。如果您没有这些信息,您也无法猜测。
-
你的代码片段:你应该在移位和 ORing 之前将数据转换为 short 以确保这些操作是在 16 位而不是 8 位数据上执行的:
u16 combine2bytes(u8 a,u8 b) { return ((u16)b) | (((u16)a) << 8); }