簡體   English   中英

從 8 位組件重組 32 位 integer

[英]recombining 32 bit integer from 8 bit components

我從文件中讀取了 4 個字符。 例如 11110000 00001111 11000011 00111100 按此順序讀取。 我需要將這些來自各個字符的字符組合起來,形成一個連續的單個 uint32_t 11110000000011111100001100111100。這是一個解決方案,我認為它似乎有效,直到它不起作用。

//#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 位數字進行或運算以組合它們。

錯誤在((32/(ByteIterator+1)-8))中——我確定這不是您想要的。 我認為(24 - (ByteIterator*8))是您的目標。

但是,有用於此類事情的庫函數(tadman 建議 ntohl)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM