【问题标题】:Convert unsigned int formatted in HEX to string将 HEX 格式的 unsigned int 转换为字符串
【发布时间】:2015-12-07 18:04:06
【问题描述】:

我正在为我的考试开发一个 hmac-sha1 类。当我必须按照https://en.wikipedia.org/wiki/Hash-based_message_authentication_code 中的描述应用两次 sha-1 时,我遇到了问题。

当我将 sha1 应用于字符串时,它会返回一个 unsigned int [5] 并计算哈希值。我想将 unsigned int [5] 转换为带有哈希的 char [40]。

例如

unsigned int H[5] = { 67452301, EFCDAB89, 98BADCFE, 10325476, C3D2E1F0 };

// char [40] will be "67452301EFCDAB8998BADCFE10325476C3D2E1F0"

所以,我可以将它连接到ipad,然后计算他的哈希ipad_hash,最后计算连接两个字符串的opad+ipad_hash。

对吗?

我使用的是 arduino uno,所以“unsigned int”是“unsigned long”。

这是我的测试代码(很乱,但我会清理它):http://pastebin.com/jfwBxAp1

【问题讨论】:

标签: c++ string hash sha1 hmacsha1


【解决方案1】:

你可以的

char hash_cstr[41];
sprintf(hash_cstr, "%08lX%08lX%08lX%08lX%08lX", H[0], H[1], H[2], H[3], H[4])

确保分配至少 41 个字符(40 个用于代码,1 个用于 NULL 终止符)。

在格式字符串中,%08X 08 表示使用 0 填充到 8 个字符,以便您获得中间字节的前导 0,而 X 表示使用大写字符的十六进制格式。您可以将小写 x 用于小写字符。十六进制格式自动假定为无符号。您可以将 lX 用于 64 位类型。

【讨论】:

  • 它不起作用,如果我用 Serial.print(H[i], HEX) 打印 H,它给了我 "1E4E888AC66F8DD41E00C5A7AC36A32A9950D271" --> 正确,如果我打印 hash_cstr 它给了我 "0000888A00001E4E00008DD400006" " --> 错了。 H 是 unsigned int 数组,hash_cstr 是 char 数组。
  • @FloydCrimson 您的编译器已将 int 定义为 16 位,因此您只能使用 X 获得 2 个字节。尝试使用 lX 或 llX。
  • 我接缝将总 4 个字节的前 2 个字节与第二个 2 交换。使用 sprintf 我可以读取整个字符串的一半...
猜你喜欢
  • 1970-01-01
  • 2019-07-16
  • 2011-09-06
  • 2015-07-11
  • 1970-01-01
  • 2018-08-05
  • 2012-01-20
  • 1970-01-01
  • 2016-08-28
相关资源
最近更新 更多