c++ 从8位分量重组32位整数

llmtgqce  于 2023-01-10  发布在  其他
关注(0)|答案(1)|浏览(134)

我从一个文件中读取了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位数进行或运算以将它们组合。

nwlls2ji

nwlls2ji1#

错误在((32/(ByteIterator+1)-8))中--我肯定这不是您想要的,我认为(24 - (ByteIterator*8))是您想要的。
然而,有一些库函数可以处理这类事情(tadman建议ntohl)。

相关问题