Чтение бинарных данных из файла
День добрый. Есть описание структуры:
Необходимо написать программу на C++/Python для чтения данных и дальнейшего анализа и обработки. Ввиду нехватки знаний, прошу помощи зала. Приведите примерчик чтения данной структуры из файла. При необходимости могу выслать сам бинарник. Заранее спасибо.
Просто, но очень платформозависимо
Окособочит из-за выравнивания, например.
Быдлокод же. Nobody cares.
какие проблемы с вырвниваем. вот только гарантировать что именно это лежит в файле нельзя
> какие проблемы с вырвниваем.
Обычные. Тебе не понятно как струтктура в памяти уляжется?
Понятно. Мне не понятна, в чем проблема, если все на одной машине одним компилятором
> Мне не понятна, в чем проблема, если все на одной машине одним компилятором
ну да, потом добавишь include на «левый» хедер со сторонней кривой библиотеки, а там народные умельцы #pragma pack для своих нужд написали, а (pop) забыли, и новая версия твоей программы радостно похерит все данные у пользователя, или ты свалишь с работы, а новый погромист скажет — а давайте мы другой компилятор возьмем, или дефолтные настройки компилятора поменяем, и будет потом вспоминать тебя и употреблять разные яркие прилагательные
Убить за изменение правил Выравнивания POD структур
Вообще плохо это. И постановка задачи тоже плохая. Ответ по уровню постановки задачи
Я бы вам посоветовал следующий подход:
1. объявляем что структура упакована
2. открываем файл и отображаем его в память. (читать через read-ом кусочками размером структуры будет слишком медленно)
Теперь по пунктам: 1. Необходимо выровнять структуру. в GCC это делается через указание атрибута __attribute__((__packed__))
Источник
Как просмотреть двоичный файл?
Из того, что я понимаю, компилятор создает двоичный файл, состоящий из 1 и 0, который может читать ЦП. У меня есть двоичный файл, но как его открыть, чтобы увидеть 1 и 0, которые есть? Текстовый редактор говорит, что он не может открыть его …
PS У меня есть сборка скомпилированных двоичных файлов, которая должна быть простым двоичным кодом 1 и 0?
возможно, если вы не хотите редактировать его, конечно. Большинство дистрибутивов linux по умолчанию имеют hexdump (но, очевидно, не все).
Обновить
xxd выполняет двоичный и шестнадцатеричный
Различные люди ответили на некоторые аспекты запроса, но не все.
Все файлы на компьютерах хранятся как 1, так и 0. Изображения, текстовые файлы, музыка, исполняемые приложения, объектные файлы и т. Д.
Они все 0 и 1. Единственное различие заключается в том, что они интерпретируются по-разному в зависимости от того, что их открывает.
Когда вы просматриваете текстовый файл с помощью cat , исполняемый файл (в этом случае cat ) считывает все значения 1 и 0 и представляет их вам, преобразуя их в символы с вашего соответствующего алфавита или языка.
Когда вы просматриваете файл с помощью средства просмотра изображений, он принимает все 1 и 0 и превращает их в изображение, в зависимости от формата файла и некоторой логики, чтобы все это исправить.
Скомпилированные двоичные файлы не отличаются друг от друга, они хранятся как 1, так и 0.
Ответ arzyfex дает вам инструменты для просмотра этих файлов по-разному, но чтение файла как двоичного файла работает для любого файла на компьютере, так же как просмотр его как восьмеричный, или шестнадцатеричный, или даже ASCII, это просто не имеет смысла в каждом этих форматов.
Если вы хотите понять, что делает исполняемый двоичный файл, вам нужно просмотреть его так, чтобы он показывал вам язык ассемблера (как начало), который вы можете использовать,
objdump -d /path/to/binary
который является дизассемблером, он берет двоичный контент и преобразует его обратно в ассемблер (который является языком программирования на очень низком уровне). objdump не всегда устанавливается по умолчанию, поэтому его необходимо установить в зависимости от среды Linux.
Некоторые внешние чтения.
NB: как указывает @Wildcard, важно отметить, что файлы не содержат символов 1 и 0 (как вы видите их на экране), они содержат фактические числовые данные, отдельные биты информации, которые либо находятся на (1) или выключить (0). Даже это описание является лишь приближением истины. Они указывают на то, что если вы найдете зрителя, который показывает вам 1 и 0, даже это все еще интерпретирует данные из файла, а затем показывает вам символы ASCII для 0 и 1. Данные хранятся в двоичном формате ( см. ссылку Двоичный номер выше). Прединичная публикация сообщества Пьера-Оливье охватывает это более подробно.
На низком уровне файл кодируется как последовательность из 0 и 1.
Но даже программисты редко ходят туда на практике.
Во-первых (и что более важно, чем эта история 0 и 1), вы должны понимать, что все, что манипулирует компьютером, закодировано цифрами .
Символ кодируется числом, используя таблицы набора символов. Например, буква «A» имеет значение 65 при кодировании с использованием ASCII. См. http://www.asciitable.com
Пиксель кодируется одним или несколькими номерами (существует много графических форматов). Например, в стандартном трехцветном формате желтый пиксель кодируется как: 255 для красного, 255 для зеленого, 0 для синего. См. http://www.quackit.com/css/css_color_codes.cfm (выберите цвет и посмотрите ячейки R, G и B)
Бинарный исполняемый файл записывается в Assembly; каждая инструкция сборки кодируется как числа. Например, инструкция сборки MOVB $0x61,%al кодируется двумя номерами: 176,97 См. http://www.sparksandflames.com/files/x86InstructionChart.html (Каждая команда имеет связанный номер от 00 до FF, поскольку шестнадцатеричная нотация, см. ниже)
Во-вторых : каждый номер может иметь несколько представлений или обозначений .
Скажем, у меня 23 яблока.
- Если я создам группы из десяти яблок, я получу: 2 десятых и 3 отдельных яблока. Это именно то, что мы имеем в виду, когда пишем 23: 2 (десятых), затем 3 (единицы).
Но я также могу сделать группы из 16 яблок. Поэтому я получу одну группу из 16 и 7 яблок. В шестнадцатеричной нотации (так называется 16-я основа) я напишу: 17. Чтобы отличить десятичную нотацию, шестнадцатеричную нотацию обычно отмечают с помощью префикса или суффикса: 17h, # 17 или $ 17. Но как представить более 9 групп из 16 или более из 9 одиноких яблок? Просто мы используем буквы от A (10) до F (15). Число 31 (как в 34 яблоках) записывается как # 1F в шестнадцатеричном виде.
По тому же принципу мы можем делать только группы из двух яблок. (И группа из двух групп из двух яблок, т. Е. Группы из 2×2-яблок и т. Д.). Затем 23: 1 группа из 2x2x2x2-яблок, 0 групп из 2x2x2-яблок, 1 группа из 2×2-яблок, 1 группа из 2 яблок и 1 одно яблоко. Который будет отмечен 10111 в двоичном
Физически механизмы, позволяющие использовать два состояния (переключатели), легко сделать, а также на диске, хранящемся в памяти.
Вот почему данные и программы, рассматриваемые как числа, записываются и обрабатываются в двоичной форме.
Затем переводится – в зависимости от типа данных – в соответствующую форму (буква А, желтый пиксель) или выполняется (инструкция MOV).
hexdump перечисляет числа, кодирующие данные (или программу сборки) в шестнадцатеричной форме. Затем вы можете использовать калькулятор для получения соответствующей бинарной формы.
Я бы начал с od (восьмеричный дамп) и в зависимости от системы мог найти полезные инструменты, такие как objdump .
Вы можете открыть его в шестнадцатеричном редакторе, который показывает его как последовательность шестнадцатеричных значений. xxd file
Что вы пытаетесь достичь?
bvi – это двоичный редактор VIsual с комбинациями клавиш vim. Он доступен для большинства Linux-систем.
Важная часть, о которой вы все еще считаете смущенной: шестнадцатеричные значения – это просто другое представление двоичных значений. Большинство шестнадцатеричных редакторов или шестнадцатеричных команд будут отображать значения в шестнадцатеричной базе, поскольку они более читабельны, чем в двоичной базе.
Что равно 35 и 32 в десятичной
Также 35 и 32 в десятичной
Вы можете просмотреть файл в двоичном формате в vim , путем:
- Открытие файла в vim
- Ввод :% !xxd -b
Команда xxd может быть дополнительно изменена, например:
- Добавив -g4 , который будет группировать биты в 32-разрядных пакетах
- Добавив -c4 , который будет форматировать вывод, будет иметь 4 байта на строку
Добавление обоих флагов выше, даст вам одно 32-битное целое число в строке.
Команда строк Linux печатает строки печатаемых символов в файлах, например:
и т. д., это более читаемо, чем двоичное.
Вы можете сделать это, например, этот рубиновый однострочный:
Традиционная система на основе C имеет плохую поддержку для вывода данных в двоичном формате AFAIK. Обычно это не очень полезно, так как читать его в отличие от шестнадцатеричных дамб довольно сложно.
GHex – ваш друг 🙂
Вы можете установить его с помощью командной строки
Источник
5 команд для просмотра содержимого файла в командной строке Linux
Главное меню » Операционная система Linux » 5 команд для просмотра содержимого файла в командной строке Linux
Чтение файла в терминале Linux – это не то же самое, что открытие файла в блокноте. Поскольку вы находитесь в режиме командной строки, вы должны использовать команды для чтения файлов в Linux.
Не беспокойтесь, это совсем не сложно для отображения файла в Linux. Также легко научиться читать файлы в строке.
Вот пять команд, которые позволяют вам просматривать содержимое файла в терминале Linux.
5 команд для просмотра файлов в Linux
Перед тем, как просмотреть файл в Unix-подобных системах, позвольте нам пояснить это, когда мы имеем в виду текстовые файлы здесь. Существуют различные инструменты и команды, если вы хотите читать двоичные файлы.
1. Cat
Это самая простая и, пожалуй, самая популярная команда для просмотра файла в Linux.
Cat просто печатает содержимое файла на стандартном экране, т.е. на экране. Это не может быть проще, чем это, не так ли?
Cat становится мощной командой, когда используется с ее параметрами. Мы рекомендуем прочитать это подробное руководство по использованию команды cat.
Проблема с командой cat в том, что она отображает текст на экране. Представьте, что вы используете команду cat с файлом, содержащим 2000 строк. Весь ваш экран будет заполнен 200 строками, и это не идеальная ситуация.
Итак, что вы делаете в таком случае? Используйте команду less в Linux (объяснено позже).
Команда nl почти как команда cat. Разница лишь в том, что она добавляет номера строк при отображении текста в терминале.
Есть несколько вариантов с командой nl, которая позволяет вам контролировать нумерацию.
3. Less
Команда Less просматривает файл по одной странице за раз. Лучше всего, чтобы вы выходили меньше (нажимая q), на экране не отображаются строки. Ваш терминал остается чистым и нетронутым.
Мы настоятельно рекомендуем изучить несколько параметров команды Less, чтобы вы могли использовать ее более эффективно.
4. Head
Команда Head – это еще один способ просмотра текстового файла, но с небольшой разницей. Команда head отображает первые 10 строк текстового файла по умолчанию.
Вы можете изменить это поведение, используя опции с командой head, но основной принцип остается тем же: команда head начинает работать с заголовка (начала) файла.
5. Tail
Команда Tail в Linux аналогична и все же противоположна команде head. В то время как команда head отображает файл с начала, команда tail отображает файл с конца.
По умолчанию команда tail отображает последние 10 строк файла.
Команды Head и Tail могут быть объединены для отображения выбранных строк из файла. Вы также можете использовать команду tail для просмотра изменений, внесенных в файл в режиме реального времени.
Бонус: Strings
Хорошо! Мы обещали показывать только команды для просмотра текстового файла. И этот имеет дело как с текстовыми, так и с двоичными файлами.
Команда Strings отображает читаемый текст из двоичного файла.
Нет, он не конвертирует двоичные файлы в текстовые файлы. Если бинарный файл состоит из реально читаемого текста, команда strings отображает этот текст на вашем экране.
Заключение
Некоторые пользователи Linux используют Vim для просмотра текстового файла, но мы думаем, что это излишне. Наша любимая команда открыть файл в Linux – это команда less. Она оставляет экран чистым и имеет несколько параметров, которые значительно упрощают просмотр текстового файла.
Какую команду вы предпочитаете?
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Источник
Как просмотреть бинарный файл?
Из того, что я понимаю, компилятор создает двоичный файл, состоящий из 1 и 0, который может прочитать процессор. У меня есть бинарный файл, но как мне открыть его, чтобы увидеть 1 и 0, которые там? Текстовый редактор говорит, что не может открыть его .
PS У меня есть сборочный двоичный файл, который должен быть простым двоичным кодом 1 и 0?
если вы не хотите редактировать это, конечно. Большинство дистрибутивов Linux имеют hexdump по умолчанию (но, очевидно, не все).
Обновить
xxd делает двоичные и шестнадцатеричные
Различные люди ответили на некоторые аспекты запроса, но не на все.
Все файлы на компьютерах хранятся как 1 и 0. Изображения, текстовые файлы, музыка, исполняемые приложения, объектные файлы и т. Д.
Все они 0 и 1. Разница лишь в том, что они интерпретируются по-разному в зависимости от того, что их открывает.
Когда вы просматриваете текстовый файл, используя cat , исполняемый файл ( cat в данном случае) читает все 1 и 0 и представляет их вам, преобразовывая их в символы из вашего соответствующего алфавита или языка.
Когда вы просматриваете файл, используя программу просмотра изображений, он берет все 1 и 0 и превращает их в изображение, в зависимости от формата файла и некоторой логики, чтобы решить все это.
Скомпилированные бинарные файлы ничем не отличаются, они хранятся как 1 и 0.
Ответ arzyfex дает вам инструменты для просмотра этих файлов по-разному, но чтение файла в двоичном формате работает для любого файла на компьютере, так же как и просмотр его как восьмеричного, или шестнадцатеричного, или даже ASCII, просто не может иметь смысла в каждом из этих форматов.
Если вы хотите понять, что делает исполняемый двоичный файл, вам нужно просмотреть его таким образом, чтобы он показал вам язык ассемблера (как начало), который вы можете сделать, используя:
objdump -d /path/to/binary
который является дизассемблером, он берет двоичный контент и преобразует его обратно в ассемблер (который является языком программирования очень низкого уровня). objdump не всегда устанавливается по умолчанию, поэтому может потребоваться установка в зависимости от вашей среды Linux.
Некоторое внешнее чтение.
NB: как указывает @Wildcard, важно отметить, что файлы не содержат символов 1 и 0 (как вы видите их на экране), они содержат фактические числовые данные, отдельные биты информации, которые либо включены (1) или выключено (0). Даже это описание является лишь приближением к истине. Ключевым моментом является то, что если вы найдете средство просмотра, которое показывает вам 1 и 0, даже если оно все еще интерпретирует данные из файла, а затем показывает символы ASCII для 0 и 1. Данные хранятся в двоичном формате ( см. ссылку на двоичный номер выше). В вики-записи сообщества Пьера-Оливье эта тема описана более подробно.
Источник