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

C++ 将作为字符串输入的数字转换为32位小端值,c++,C++,输入->字符串:“208705” 输出->字节数组:{0x41,0x2F,0x03} 我已使用stringstream将字符串转换为十六进制格式: string decStrToHex(string decimalString) { std::stringstream ss; ss<< std::hex << stoi(decimalString); std::string result ( ss.str() ); return "0" +

输入->字符串:“208705”

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

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

string decStrToHex(string decimalString) {
    std::stringstream ss;
    ss<< std::hex << stoi(decimalString);
    std::string result ( ss.str() );
    return "0" + result;
}
string decStrToHex(string decimalString){
std::stringstream-ss;
党卫军
如何将(十进制格式)字符串转换为(恒定大小的十六进制格式)字节数组:

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

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

如果我把它放在计算器里

把它转换成十六进制,看起来像

因此,
0x41
是LSB,最后显示

您所声明的字节数组的实际外观以及字节的顺序取决于机器体系结构(请参阅)

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

下一步是确保该数字有一个小小的endian表示:

 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;
输出字节数组:{0x41,0x2F,0x03}

如何将(十进制格式)字符串转换为(恒定大小的十六进制格式)字节数组:

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

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

如果我把它放在计算器里

把它转换成十六进制,看起来像

因此,
0x41
是LSB,最后显示

您所声明的字节数组的实际外观以及字节的顺序取决于机器体系结构(请参阅)

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

下一步是确保该数字有一个小小的endian表示:

 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;
输出字节数组:{0x41,0x2F,0x03}


请参见

有关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;

}
无符号字符GetByte(int i,int n)
{
int Mask=0xFF;
面罩(n*8);
}
std::数组decStrToHex(std::string decimalString)
{
int-Val;
std::stringstream ss(十进制字符串);
ss>>Val;
std::阵列Arr;
对于(int i=0;i<3;i++)
Arr[i]=GetByte(Val,i);
返回Arr;
}

对于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;

}
无符号字符GetByte(int i,int n)
{
int Mask=0xFF;
面罩(n*8);
}
std::数组decStrToHex(std::string decimalString)
{
int-Val;
std::stringstream ss(十进制字符串);
ss>>Val;
std::阵列Arr;
对于(int i=0;i<3;i++)
Arr[i]=GetByte(Val,i);
返回Arr;
}

如何将
{0x41,0x2F,0x03}
208705关联
实际上?32位整数表示法?小或大端结构?我的手动计算器将208705转换为0x032f41。因此,数组的第一个字节是十进制整数的lsByte,长度为3字节?最后一个字节是数字的msByte?如果输入字符串长于uint64_t(多精度)的最大位数,该怎么办?您的问题不完整。
{0x41,0x2F,0x03}
应如何与
“208705”相关
实际上?32位整数表示法?小或大端结构?我的手动计算器将208705转换为0x032f41。因此,数组的第一个字节是十进制整数的lsByte,长度为3字节?最后一个字节是数字的msByte?如果输入字符串长于uint64_t(多精度)的最大位数,该怎么办?您的问题不完整。当使用setfill和setw数字(如3)进行填充时,如何实际将其作为字节(无符号字符)?@siimveskillt“当使用setfill和setw数字(如3)进行填充时”实际上是什么意思,我不明白?输出完全如我所示,没有任何“填充”。如果希望省略MSB,只需循环(size_t i=0;i
我希望输出类似于BYTE bytes[4]={0x41,0x2f,0x03,0x00};我可以将其输入sendPacket函数,0x03在没有填充的情况下不是0x03。@Siimveskit您混淆了表示和内容。确实需要指示表示流的文本如何填充
setw()声明的所需宽度
。默认的填充字符是
,因此您需要放入
std::setfill('0')
语句。当使用setfill和setw数字(如3)进行填充时,如何实际将其作为字节(无符号字符)?@SiimVeskilt“当使用setfill和setw数字(如3)进行填充时”实际上,你是什么意思,我不明白?输出与我所展示的一模一样,没有“填充”。如果你想省略MSB,只需循环(size_t I=0;I我希望输出类似于字节[4]={0x41,0x2f,0x03,0x00};我可以将其输入sendPacket函数,0x03在没有填充的情况下不是0x03。@Siimveskit您混淆了表示和内容。确实需要指示表示流的文本如何填充
setw()声明的所需宽度
。默认的填充字符是
'
,因此需要放入
std::setfill('0')
语句。