我得到应该包含字节(字符数组)的 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());
}
我记录的数据是: ffffff81 0a 53 3a 30 30 38 31 30 36 43 38
为什么以及如何出现这个 ffffff81?如果 string.at 应该返回 char?
最佳答案
当你写 (unsigned int)data.at(i)
, data.at(i)
是 char
然后提交给整数提升。如果在您的系统上 char 是有符号的,则大于 127 的值将被解释为负数。符号位将保留在整数提升中,给出如此奇怪的结果。
您可以通过查看 numeric_limits<char>::is_signed
来验证 char 是否已签名
您可以通过将整数与 0xff 进行与运算来去除整数提升所添加的位,从而轻松解决此问题:(static_cast<int>(data.at(i)) & 0xff)
另一种方法是强制您的编译器使用无符号字符。例如,使用选项 -funsigned-char
在 gcc 或 /J
上与MSVC。
关于c++ - 来自字符串元素的奇怪转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25828174/