C++ 为什么函数以相反的顺序显示十六进制代码?
下面的代码(在C++中)应该获取一些数据及其大小(以字节为单位),并返回包含十六进制代码的字符串C++ 为什么函数以相反的顺序显示十六进制代码?,c++,endianness,C++,Endianness,下面的代码(在C++中)应该获取一些数据及其大小(以字节为单位),并返回包含十六进制代码的字符串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
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] = '\0';
return (vf);
}
输出不是应该是
000015B3
?那么,为什么会以相反的顺序显示呢?代码有什么问题吗(我在Ubuntu中使用的是g++编译器)?您看到了在您的体系结构中用于表示整数的字节的存储顺序,这恰好是little endian。这意味着,最低有效字节排在第一位
如果希望以普通数字形式显示,则需要检测体系结构的endianness并相应地切换代码,或者只使用字符串流:
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;
无符号整数a=5555;
std::ostringstream ss;
ss这个架构是特定于平台还是特定于编译器?对不起,这个愚蠢的问题…它是特定于架构的。现在大多数通用计算机都是小端机。请注意,编译器知道目标是什么体系结构,因此可以在编译时进行endianness检查。
B3150000
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;