我从一个文件中读取了4个字符。例如,11110000 00001111 11000011 00111100按此顺序读取。我需要将各个字符中的这些字符组合起来,以形成一个连续的单一uint32_t 1111000000000111111100。下面是我决定的解决方案,该解决方案似乎一直有效,直到不起作用为止。t.
//#include <fstream>
#include <cstdint>
#include <iostream>
//std::fstream File("example", std::ios::binary | std::ios::out | std::ios::in);
char FileDataExpectedResult[4] = {0x00, 0x00, 0x00, 0x0D};
char FileDataUnexpectedResult[4] = {0x00, 0x00, 0x03, 0x64};
uint32_t Reasemble(char* FileDataArray)
{
uint32_t Result=0x0;
char ComponentByte;
for (int ByteIterator=0; ByteIterator<4; ByteIterator++ )
{
//File.read(&ComponentByte, 1);
ComponentByte = FileDataArray[ByteIterator];
uint32_t ExtendedComponentByte = 0x0000 | ComponentByte;
Result = Result | (ExtendedComponentByte << ((32/(ByteIterator+1)-8)));
}
return Result;
}
int main() {
uint32_t Expected = Reasemble(FileDataExpectedResult);
uint32_t Unexpected = Reasemble(FileDataUnexpectedResult);
std::cout << "hopefully 13: " << (int)Expected << "\n";
std::cout << "hopefully 868: " << (int)Unexpected << "\n";
return 1;
}
此代码是在一个更简单的环境中重新创建的。当此代码从文件中读取0x0000000D时,它会将其正确转换为13。但是,0x00000364返回108,而不是预期的868。其思想是逐字节读取,然后将其放入32位数字中,并根据其在32位数字中的字节进行移位,然后将每一个与奇异的32位数进行或运算以将它们组合。
1条答案
按热度按时间nwlls2ji1#
错误在
((32/(ByteIterator+1)-8))
中--我肯定这不是您想要的,我认为(24 - (ByteIterator*8))
是您想要的。然而,有一些库函数可以处理这类事情(tadman建议ntohl)。