[英]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.