(这是在SHA256中填充消息的后续问题。)
(我正在尝试在C ++中实现SHA-256哈希函数。我这样做纯粹是出于娱乐和学习目的。)
我的绳子message
长了message_length
。余与位已所附字符串1
随后0
S以便串的长度是现在448位模512个比特。
现在,我需要在字符串后附加带有message_length
64位大端整数的字符串,但是我不太清楚如何在C ++中执行此操作。
那么为了论证,可以说message_length
是3个字节= 24位。十六进制的24是18
,因此我需要附加00 00 00 00 00 00 00 18
到字符串中。
所以我想要的是一个将整数3转换为字符串的函数,00 00 00 00 00 00 00 18
以便我可以附加它。
我的问题归结为
如何在C ++中将64位整数转换为大端字节数组
编辑:我只是重新阅读了您的问题(打算对其进行编辑)。我认为您误解了SHA256希望您使用的格式。无需附加00 00 00 00 00 00 00 18
消息长度为24的字符串(每个字节用十六进制编码并用空格分隔),而是需要附加原始字节0x00、0x00、0x00、0x00、0x00、0x00、0x00和0x18。它们不代表任何可打印的字符。有关获取这些字节的方法,请参见下文。我的示例使用一个整数,其字节表示恰好仅包含可打印字符(ASCII)。
顺便说一句,填充到448位的原因是,在512位的完整块大小中还剩下64位,因此可以在其中放入消息长度的大端编码。
您可以使用提取单个字节,num
使用num>>(8*i) & 0xff
将获得的最低有效字节i=0
和无符号长整数(64位)的最高有效字节i=7
。遍历所有位置,您可以获得每个字节:
unsigned long num = 0x626967656e646961L;
//Store big endian representation in a vector:
std::vector<unsigned char> bigEndian;
for(int i=7; i>=0; i--){
bigEndian.push_back( (num>>(8*i)) & 0xff );
}
如果需要将其作为字符串,则可以使用字符串的迭代器构造函数将其转换:
std::string bigEndianString(bigEndian.begin(),bigEndian.end());
带有测试输出的完整代码:
#include <iostream>
#include <string>
#include <vector>
int main() {
unsigned long num = 0x626967656e646961L;
//Store big endian representation in a vector:
std::vector<unsigned char> bigEndian;
for(int i=7; i>=0; i--){
bigEndian.push_back( (num>>(8*i)) & 0xff );
}
//Convert vector to string:
std::string bigEndianString(bigEndian.begin(),bigEndian.end());
//Test correctness:
for(std::vector<unsigned char>::const_iterator it = bigEndian.begin(); it != bigEndian.end(); ++it) {
std::cout << std::hex << (int)*it << ' ';
}
std::cout << std::endl << bigEndianString << std::endl;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句