从 char 向量转换为 short 向量和 float 向量

问题描述

我编写了这个程序来将字符转换为短:

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 相似?如何获得浮点数?

提前致谢

解决方法

它所依赖的著名答案适合这里。

  1. MSB/LSB:这取决于您如何存储这些字节,例如,如果您将 MSB 存储在矢量 case 0 中,那么在读取时您应该考虑这一点。如果您没有这些信息,您将无法猜测。

  2. 数据类型:这取决于您在那里存储的数据。例如,如果它是一个浮点数,那么只需进行位移位然后进行转换,您可以通过一个具体的例子来尝试。但是,如果是另一个程序编写了这些字节,或者它们不是在同一架构上编写的,那么您应该有一个协议来定义哪些字节用于尾数。如果您没有这些信息,您也无法猜测。

  3. 你的代码片段:你应该在移位和 ORing 之前将数据转换为 short 以确保这些操作是在 16 位而不是 8 位数据上执行的:

    u16 combine2bytes(u8 a,u8 b) {
           return ((u16)b) | (((u16)a) << 8);
    }