为什么函数以相反的顺序显示十六进制代码?
Why is the function displaying the hex code in reverse order?
以下代码(在 C++ 中)应该获取一些数据及其大小(以字节为单位)和 return 包含十六进制代码的字符串。 size
是存储在val
中的内存块的大小。
std::string byteToHexString(const unsigned char* val, unsigned long long size)
{
unsigned char temp;
std::string vf;
vf.resize(2 * size+1);
for(unsigned long long i= 0; i < size; i++)
{
temp = val[i] / 16;
vf[2*i] = (temp <= 9)? '0' + temp: 'A' + temp - 10; // i.e., (10 = 9 + 1)
temp = val[i] % 16;
vf[2*i+1] = (temp <= 9)? '0' + temp: 'A' + temp - 10; // i.e., (10 = 9 + 1)
}
vf[2*size] = '[=10=]';
return (vf);
}
所以按以下方式执行上述功能:
int main()
{
unsigned int a = 5555;
std::cout << byteToHexString((unsigned char*)(&a), 4);
return 0;
}
我们得到的输出是:
B3150000
输出不应该是000015B3
吗?那么为什么会以相反的顺序显示呢?代码有问题吗(我在 Ubuntu 中使用 g++ 编译器)?
您看到了在您的体系结构中用于表示整数的字节存储顺序,恰好是 little-endian。这意味着,最低有效字节在前。
如果你想以正常的数字形式显示它,你要么需要检测你的体系结构的字节顺序并相应地切换代码,要么只使用字符串流:
unsigned int a = 5555;
std::ostringstream ss;
ss << std::setfill( '0' ) << std::setw( sizeof(a)*2 ) << std::hex << a;
std::cout << ss.str() << std::endl;
以下代码(在 C++ 中)应该获取一些数据及其大小(以字节为单位)和 return 包含十六进制代码的字符串。 size
是存储在val
中的内存块的大小。
std::string byteToHexString(const unsigned char* val, unsigned long long size)
{
unsigned char temp;
std::string vf;
vf.resize(2 * size+1);
for(unsigned long long i= 0; i < size; i++)
{
temp = val[i] / 16;
vf[2*i] = (temp <= 9)? '0' + temp: 'A' + temp - 10; // i.e., (10 = 9 + 1)
temp = val[i] % 16;
vf[2*i+1] = (temp <= 9)? '0' + temp: 'A' + temp - 10; // i.e., (10 = 9 + 1)
}
vf[2*size] = '[=10=]';
return (vf);
}
所以按以下方式执行上述功能:
int main()
{
unsigned int a = 5555;
std::cout << byteToHexString((unsigned char*)(&a), 4);
return 0;
}
我们得到的输出是:
B3150000
输出不应该是000015B3
吗?那么为什么会以相反的顺序显示呢?代码有问题吗(我在 Ubuntu 中使用 g++ 编译器)?
您看到了在您的体系结构中用于表示整数的字节存储顺序,恰好是 little-endian。这意味着,最低有效字节在前。
如果你想以正常的数字形式显示它,你要么需要检测你的体系结构的字节顺序并相应地切换代码,要么只使用字符串流:
unsigned int a = 5555;
std::ostringstream ss;
ss << std::setfill( '0' ) << std::setw( sizeof(a)*2 ) << std::hex << a;
std::cout << ss.str() << std::endl;