0

Нужно на C++ сделать вот что: открыть файл, как если бы его открыли в шестнадцатеричном редакторе, дойти до строки 00000030, при длине строки 16 символов, и вывести hex-содержимое этой строки на экран. Причём именно в hex, никак не в строковом виде!


Harry, хз, я пробовал так:

#include <fstream>
#include <string>
#include <iostream>
using namespace std;

int main() { ifstream myfile; myfile.open("file.bin", ios::binary); string tmpl; while(getline(myfile, tmpl)) { cout << hex << tmpl << endl; } return 0; }

Qwertiy
  • 123,725
  • 1
    Читаете побайтово, выводите в шестнадцатеричном виде, в чем проблема? Через cout — читайте о hex, через printf - о %X... – Harry May 25 '22 at 11:57
  • string tmpl; ifstream fileo; fileo.open("file.bin", ios::in); while (getline(fileo, tmpl)) { cout << hex << tmpl << endl; };. Вот так? – RandomDice 779 May 25 '22 at 11:59
  • прочитал. Там через hex выводится число. А мне надо строку/бинарные данные прогнать – RandomDice 779 May 25 '22 at 12:02
  • 1
    Нет, конечно... Открывайте как бинарный а не текстовый. Если нужна только строка 00030 (это число шестнадцатеричное или десятичное?), становитесь на нужную позицию в файле (seekg()), и читаете 16 байт. Потом выводите. Или в цикле 16 раз по 1 байту. – Harry May 25 '22 at 12:02
  • 1
    Там через hex выводится число. А мне надо строку/бинарные данные прогнать Как все запущено... В памяти, в файле нет строк или символов или чисел... Все упирается в вопрос, как именно трактовать набор байтов :) – Harry May 25 '22 at 12:03
  • https://ru.stackoverflow.com/a/1413657/478514 – RandomDice 779 May 25 '22 at 12:09
  • https://ru.stackoverflow.com/a/453060/178988 – Qwertiy May 25 '22 at 14:49

2 Answers2

1

Ну, например, так. Только убедитесь, что файл достаточной длины :)

int main()
{
    ifstream in("data",ios::binary);
    if (!in.is_open()) { cerr << "Error open file\n"; return 1; }
    if (!in.seekg(0x30*16)) { cerr << "Error seek file\n"; return 1; }
    unsigned char buf[16];
    if (!in.read((char*)buf,16)) { cerr << "Error read file\n"; return 1; }
    cout << hex << setfill('0');
    for(int i = 0; i < 16; ++i)
        cout << setw(2) << (unsigned int)buf[i] << ' ';

}

Harry
  • 221,325
  • ответ отличный, но только я думаю, что все таки in.seekg(0x30), не нужно умножать на 16. Но может у автора вопроса особый hex редактор. – KoVadim May 25 '22 at 14:38
  • @KoVadim У него 0x30 - номер строки, где каждая строка по 16 байт... – Harry May 25 '22 at 15:38
  • Зная хекс редакторы, Я сомневаюсь – KoVadim May 25 '22 at 16:11
  • я через xxd дампал – RandomDice 779 May 25 '22 at 16:30
  • Если так, то похоже я прав – KoVadim May 25 '22 at 16:48
  • @KoVadim Ну... я исходил из дойти до строки 00000030, при длине строки 16 символов. Конечно, если это смещение, то умножение на 16 не нужно... Но тогда надо подправить сам вопрос. – Harry May 25 '22 at 17:16
  • Видимо я больше с хекс редакторами работал – KoVadim May 25 '22 at 18:04
0

Конкретно с чтением в hex разобрался.

ifstream binfile;
binfile.open("file.bin", ios::binary);
char ipc;
while(binfile.get(ipc)) {
    cout << hex << (int)ipc;
}

binfile.get - чтение по байтам. (int)ipc - перевод char в int.

  • Конкретно в вашей задаче строка - это 16 байт. Вам нужно сначала пропустить (0x30-1) * 16 байт, а потом считать 16 байт и вывести на экран в шестнадцатеричном формате. – DmitryK May 25 '22 at 12:51
  • Неправильно. Ширину вывода не выставил. – Qwertiy May 25 '22 at 14:51