美文网首页
HMAC生成sign值转16进制,特殊字符0x00,转换失败

HMAC生成sign值转16进制,特殊字符0x00,转换失败

作者: wuli拉索哈迪 | 来源:发表于2020-03-04 19:27 被阅读0次

    linux下C语言实现16进制转码:

    sprintf与snprintf


    sprintf(&digest[i*2], “%02x”, (unsigned int)sign_byte[i]);

    sprintf遇到二进制为0x00,转16进制失败,后续的内容都会转为0x00。

    snprintf(&digest[i*2], sizeof(digest), “%02x”, (unsigned int)sign_byte[i]);

    可解决上面的问题。


    对sprintf和snprintf进行一下对比分析。

    snprintf:

    C 库函数 int snprintf(char *str, size_t size, const char *format, ...) 设将可变参数(...)按照 format 格式化成字符串,并将字符串复制到 str 中,size 为要写入的字符的最大数目,超过 size 会被截断。

    返回值

    (1) 如果格式化后的字符串长度小于等于 size,则会把字符串全部复制到 str 中,并给其后添加一个字符串结束符 \0;

    (2) 如果格式化后的字符串长度大于 size,超过 size 的部分会被截断,只将其中的 (size-1) 个字符复制到 str 中,并给其后添加一个字符串结束符 \0,返回值为欲写入的字符串长度。

    sprintf:

    C 库函数 int sprintf(char *str, const char *format, ...) 发送格式化输出到 str 所指向的字符串。

    返回值

    如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。

    因为sprintf可能导致缓冲区溢出问题而不被推荐使用,所以在项目中我一直优先选择使用snprintf函数,虽然会稍微麻烦那么一点点。这里就是sprintf和snprintf最主要的区别:snprintf通过提供缓冲区的可用大小传入参数来保证缓冲区的不溢出,如果超出缓冲区大小则进行截断。但是对于snprintf函数,还有一些细微的差别需要注意。

    sprintf函数返回的是实际输出到字符串缓冲中的字符个数,不包括null结束符。而snprintf函数返回的是应该输出不大于size个数,包括null结束符。

    相关文章

      网友评论

          本文标题:HMAC生成sign值转16进制,特殊字符0x00,转换失败

          本文链接:https://www.haomeiwen.com/subject/aoqilhtx.html