【发布时间】: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)之外,实际上不可能遵循和理解你在其中尝试做什么。把它写成一个普通函数,问题很可能会被发现(如果没有,你仍然可以轻松调试代码并找到它)。