将作为字符串输入给出的数字转换为32位小端值

时间:2016-04-21 17:30:21

标签: c++

输入 - >字符串:“208705”

输出 - > BYTE数组:{0x41,0x2F,0x03}

我已使用stringstream将字符串转换为十六进制格式:

string decStrToHex(string decimalString) {
    std::stringstream ss;
    ss<< std::hex << stoi(decimalString);
    std::string result ( ss.str() );
    return "0" + result;
}

如何进行?

2 个答案:

答案 0 :(得分:2)

  

如何从(十进制格式)字符串转换为(常量大小的十六进制格式)BYTE数组:...

没有从字符串直接转换为您想要的字节数组。

看起来您希望将作为字符串输入的数字转换为32位小端值。

如果我把它放在我的计算器中

enter image description here

并将其转换为十六进制,看起来像

enter image description here

所以0x41是LSB并最后出现。

您声明的字节数组实际上应该如何以及字节的排序方式取决于计算机体系结构(请参阅Endianess)。

首先,您只需转换数字(还有其他方式,但我会以此为例):

 uint32_t number;
 std::istringstream iss("208705");
 iss >> number;

下一步是确保您拥有该数字的小端表示:

 union LittleEndian32Bit {
     uint32_t uint;
     uint8_t[4] bytes;
 }; 

你可以拥有

 LittleEndian32Bit le;

 le.bytes[0] = number & 0xFF;
 le.bytes[1] = (number >> 8) & 0xFF;
 le.bytes[2] = (number >> 16) & 0xFF;
 le.bytes[3] = (number >> 24) & 0xFF;
  

输出BYTE数组:{0x41,0x2F,0x03}

 std::cout << '{';
 for(size_t i = 0; i < sizeof(le.bytes); ++i) {
     if(i != 0) {
         std::cout << ", ";
     }
     std::cout << "0x" << std::hex << std::setw(2) << std::setfill('0')
               << (unsigned int)le.bytes[i];
 }
 std::cout << '}' << std::endl;

嗯,第四个字节还有一个:

{0x41, 0x2f, 0x03, 0x00}

请参阅Live Demo

答案 1 :(得分:1)

对于3字节的固定数组,您可以执行以下操作:

unsigned char GetByte(int i, int n)
{
    int Mask = 0xFF;
    Mask <<= n * 8;
    return (i & Mask) >> (n * 8);
}

std::array<unsigned char, 3> decStrToHex(std::string decimalString)
{
    int Val;
    std::stringstream ss(decimalString);
    ss >> Val;

    std::array<unsigned char, 3> Arr;
    for (int i = 0; i < 3; i++)
        Arr[i] = GetByte(Val, i);

    return Arr;

}