2 与 "\2" 之间的区别

Difference between 2 vs "\2"

在尝试实现 IKE 会话密钥生成算法时,我遇到了以下算法实现的代码片段 生成某个会话密钥的算法

SKEYID_e = HMAC (SKEYID, SKEYID_a || gxy || CKY-I || CKY-R || 2)

获取数字 2 的最后一个连接 HMAC 的实现

hmac_update(ctx, (unsigned char *) "", 1)

这里 hmac_update 是 API 用于在最终确定摘要之前连接缓冲区以获取 HMAC,CTX 是 HMAC 上下文“\2”是添加数字 2,1 是大小缓冲区。

我的问题是转义 unsigned char * ""char/uint8_t2

之间有什么区别

"2" 描述了十六进制代码为 2 的字符(这是一个不可打印的字符,检查 http://ascii-table.com/info.php?u=x0002);
数字“2”的十六进制代码为 0x050 = 50,可打印字符“2”也是如此。

不同的是achar数值为2和字符串""是前者是achar而后者是字面量表示包含a的字符数组char 数值为 2,然后 char 数值为 0。换句话说:

  • (char)2 是单个字符。它的类型是 char。它的值为 2.
  • ""是一个字符数组。它的类型衰减为 const char*。它的第一个条目是 2,第二个条目是 0。

由于 hmac_update 期望它的第二个参数是指向要在更新中使用的字节的指针,因此您不能提供 2(char)2 作为参数,因为这样做会尝试将整数转换为指针(oops)。使用 "" 通过提供指向相关字节的指针解决了这个问题。你也可以这样做:

const char value = 2;
hmac_update(ctx, &value, 1);