我有以下程序
#include <iostream>
#include <string.h>
int main(int argc, char* argv[])
{
std::cout << std::hex << (int) argv[1][0];
std::cout << std::hex << (int) argv[1][1];
std::cout << std::hex << (int) argv[1][2];
std::cout << std::hex << (int) argv[1][3];
std::cout << std::endl;
size_t len = strlen(argv[1]);
std::cout << "Len: " << len << std::endl;
return 0;
}
当我以这种方式运行时:
./ a.out $(python -c“ print'\ x01 \ x01 \ x01 \ x01'”)
输出为:
1111
Len:4
但是当我以这种方式运行时:
./ a.out $(python -c“ print'\ x21 \ xdd \ x09 \ xec'”)
输出差异很大。
21ffffffdd0ffffffec
Len:2
我不知道为什么会这样。这可能是显而易见的,但我无法理解。
我特别感兴趣-为什么strlen不能按我的预期工作。
答案 0 :(得分:1)
0xdd
的最高有效位是1。显然,系统上的char
类型是带符号的。因此,您得到一个负值,将其强制转换为int会使它为负。
解决方案:之前强制转换为unsigned char
;另外,我也更喜欢使用无符号整数来打印十六进制表示形式,所以:
std::cout << std::hex << static_cast<unsigned int>(static_cast<unsigned char>(argv[1][0]));
如果您喜欢C ++强制转换(例如我)或保留C风格的强制转换在这里没有影响...
那么,您还有第二个问题:python print
函数的输出编码;默认情况下,您将获得utf-8输出,请参见related question。