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_t
值 2
之间有什么区别
"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);
在尝试实现 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_t
值 2
"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);