繁体   English   中英

如何在C ++中将64位整数转换为大端字节数组

[英]How can I convert a 64bit integer to a big-endian byte array in C++

(这是在SHA256中填充消息的后续问题。)

(我正在尝试在C ++中实现SHA-256哈希函数。我这样做纯粹是出于娱乐和学习目的。)

我有长度为message_length字符串message 我在字符串后附加了位10 s,以使字符串的长度现在是448位和512位。

现在,我需要将message_length的字符串作为64位big-endian整数附加到字符串中,但是我不太清楚如何在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 (每个字节用十六进制编码并用空格分隔),而是附加原始字节0x00、0x00、0x00、0x00、0x00、0x00、0x00和为0x18。 它们不代表任何可打印字符。 有关获取这些字节的方法,请参见下文。 我的示例使用一个整数,其字节表示恰好仅包含可打印字符(ASCII)。

顺便说一句,填充到448位的原因是,在512位的完整块大小中还剩下64位,因此可以在其中放入消息长度的大端编码。


您可以提取单个字节num使用num>>(8*i) & 0xff ,您将得到至少显著字节, i=0和一个unsigned long(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;

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM