Чтение шестнадцатеричных чисел в виде 2 цифр на символ из файла bin -c ++ - PullRequest
0 голосов
/ 09 января 2019

Я пишу программу на c ++ для чтения файла bin. В двоичном файле содержится следующий пример содержимого.

10 00 01 02 20 03 04 40 50 .....

Проблема здесь в том, что при использовании обычного чтения из файла bin, байт 10, 40, 50 читается правильно. Но в случае 00, 01, 02 03 .... они читаются как 0, 1, 2, 3 соответственно.

Но я хочу, чтобы отдельные байты 00 01 02 03 и т.д. также читались как 00 01 02 03 и т.д. ** Причина в том, что я пытаюсь преобразовать значения в двоичные. поэтому я хочу получить двоичный эквивалент ** "10 00 01 02" , который равен 10000000000000000000100000010 . Но поскольку содержимое интерпретируется как 10012 , я получаю 10000000000010010 в качестве результата. Пожалуйста, помогите мне в решении этого. Извините, если содержание слишком длинное. Заранее спасибо.

Я использовал следующий код. // вырезать коротко для простоты

fstream fp;
fp.open(binFile, ios::binary | ios::in);
char * buffer = new char[4];
// read data as a block:
fp.read(buffer, 4);
// copied the contents of buffer[] to a string str
stringstream ss;
for (std::string::iterator it = str.begin(); it != str.end(); ++it)
{
    ss << std::hex << unsigned(*it);
}
ss >> intvalue; // stores the converted hex value 
string binstring = bitset<32>(intvalue).to_string();
cout<<binstring // produces wrong value. 

1 Ответ

0 голосов
/ 09 января 2019

Преобразование однобайтовых чисел в более крупные типы обычно выполняется с использованием битовых сдвигов.

unsigned char * buffer = new unsigned char[4];
fp.read(buffer, 4);
uint32_t result =  buffer[0] << 24 | buffer[1] << 16 | buffer[2] << 8 | buffer[3];

Если вы хотите иметь строку объект ( не число) с шестнадцатеричным представлением числа с начальными нулями, заполненного до 8 символов шестнадцатеричное представление, вы действительно можете использовать перегруженный оператор << с некоторым количеством iomanip, чтобы распечатать его. Вы должны использовать hex и распечатать его с ведущими нулями. Вы также должны привести к целому числу, потому что символы печатаются как символы, а не как числа.

std::stringstream ss;
for (size_t i = 0; i < 4; ++i) {
   ss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(buffer[i]);
}
std::string str(ss.str);

или

std::stringstream ss;
ss  << std::hex << std::setw(8) << std::setfill('0') << result;
std::string str(ss.str);

Если вы хотите иметь строковый объект с представлением числа в базе 2, включая ведущие нули, вы действительно можете использовать bitset to_string():

for (size_t i = 0; i < 4; ++i) {
   std::cout << bitset<8>(buffer[i]).to_string();
}

или снова используйте result сверху:

std::cout << bitset<32>(result).to_string();
...