将十六进制数字作为主要函数参数传递

时间:2019-06-27 18:00:27

标签: python c++

我有以下程序

#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不能按我的预期工作。

1 个答案:

答案 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