【发布时间】:2021-11-13 11:44:57
【问题描述】:
我需要像这样转换大位字符串:
unsigned char* key = "0111010111010101010101010100101011010";
转成这样的十六进制字符串:
unsigned char* string = EBAAAA95A;
问题是我的密钥通常超过 50 或 60 位,当我尝试使用 strtoll(key, NULL, 2) 转换它们时,返回的数字远远大于 long long int 甚至可以容纳的数字。有没有一种直接将其转换为十六进制的有效方法?
非常感谢您的帮助!
【问题讨论】:
-
不要使用数字将位转换为十六进制。它们只是字符串。计算位数,以便您可以从右侧开始将它们分成四组,然后将每四组(或一对四的初始组)转换为一个十六进制数字。
-
您可以将字符串分成更小的数字并单独解析它们。 Here's an example I just hacked together that reads the string nibble-by-nibble。我不会将它作为答案发布,因为我对它并不完全满意(源字符串的长度必须是 4 的倍数,不验证源字符串),但是是的,这只是一个示例。
-
@mediocrevegetable1 我做了something similar,但改用了一张桌子。我们的两种解决方案都存在相同的问题,即输入必须是 4 的倍数,否则会导致 UB。
-
即使产品/库推荐偏离主题:en.wikipedia.org/wiki/…
-
如果位串不是四的精确倍数,则在开头添加 0、00 或 000 以给出十六进制数字的确切数量。
标签: c binary cryptography hex ansi