【问题标题】:Converting characters to hexadecimal将字符转换为十六进制
【发布时间】:2014-02-17 10:59:59
【问题描述】:

我正在尝试将密文(来自 AES 加密)转换为十六进制值。

我正在使用以下代码(状态为密文)进行转换:

foreach(char *v, state) {
    printf("%02X", *v);
}       

对于这个密文:

    '4¥W[™úËj$Ó¶U6

我得到这个输出:

    2734FFFFFFA5575BFFFFFF99FFFFFFFAFFFFFFCB6A240BFFFFFFD318FFFFFFB65536

这不是此密文的正确十六进制形式。我尝试了其他所有导致相同结果的转换方法。

编辑: foreach 代码:

#define foreach(item, array) \
for(int keep = 1, \
count = 0,\
size = sizeof (array) / sizeof *(array); \
keep && count != size; \
keep = !keep, count++) \
for(item = (array) + count; keep; keep = !keep)

【问题讨论】:

  • 您的值需要是无符号的,否则您将扩展符号位。将*v 转换为unsigned char
  • 那个foreach 宏可能会赢得某种最难维护的代码奖。
  • 这是使用宏的一种非常糟糕的方式。除了你在定义中至少有一个错误 - sizeof *(array) 和你调用它的方式中的一个错误 - foreach(char *v, state) 之外,实际上不可能遵循和理解你在其中尝试做什么。把它写成一个普通函数,问题很可能会被发现(如果没有,你仍然可以轻松调试代码并找到它)。

标签: c hex ascii


【解决方案1】:

那不是 C,C 中没有 foreach。它可能是 C++,在这种情况下,问题是 printf()%x 转换说明符的参数被符号扩展。您的平台可能有一个签名的char 类型。

将值转换为unsigned char

【讨论】:

  • 是的,我忘记添加foreach宏了。
猜你喜欢
  • 2018-01-31
  • 2018-01-22
  • 2013-02-07
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 2017-08-23
相关资源
最近更新 更多