我得到std:string应该包含字节(字符数组),我试图显示字节,但第一个字节总是包含奇怪的数据:
4294967169,这怎么可能是一个字节/字符?!
void do_log(const std::string & data) {
std::stringstream ss;
ss<< "do_log: ";
int min = min((data.length()), (20)); // first 20 bytes
for (int i=0;i<min;i++)
{
ss << setfill ('0') << setw(2) << hex << (unsigned int)data.at(i) <<" ";
}
log(ss.str());
}
Data I log是: ffffff81 0a 53 3a 30 30 38 31 30 36 43 38
这个ffffff81出现的原因和方式如何?如果string.at应该返回char?
答案 0 :(得分:3)
当您撰写(unsigned int)data.at(i)
时,data.at(i)
为char
,然后提交整数提升。如果在您的系统上对char进行了签名,则大于127的值将被解释为负数。符号位将保留在整数提升中,从而产生如此奇怪的结果。
您可以通过查看numeric_limits<char>::is_signed
你可以通过去除整数提升所添加的位,通过将整数与0xff进行AND运算来轻松解决问题:(static_cast<int>(data.at(i)) & 0xff)
另一种方法是强制编译器使用unsigned chars。例如,使用gcc上的选项-funsigned-char
或使用MSVC的/J
。
答案 1 :(得分:1)
string
包含签名字符
因此字符0x81被解释为负数,如0xFFFFFF81
您将此字符转换为unsigned int,因此它变为非常大的数字。