Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/76: Рейтинг темы: голосов - 76, средняя оценка - 4.83
2 / 2 / 2
Регистрация: 16.04.2013
Сообщений: 15

Считывание бинарного файла в виде нулей и единиц

16.04.2013, 10:30. Показов 14916. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Необходимо реализовать помехоустойчивое кодирование для файла(код Хэмминга, если быть точным). Для этого мне необходимо каждый байт входного файла рассматривать в виде последовательности бит и иметь доступ к каждому биту.
Сам алгоритм кодирования для текстовых файлов реализовал без проблем(каждый считываемый символ приводил к нужному виду с помощью
Python
1
"%08i" % int(bin(ord('CHAR'))[2:])
), но с бинарными файлами не получается.

Суть проблемы:
Python
1
2
3
4
5
6
7
Python 3.2.3 (default, Oct 19 2012, 19:53:57) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open("file", "rb").read()
>>> f
b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\x00\x00\x04\xc3IDATx\xda\xa5\x95{P\x94U\x18\xc6#\xd0LED \x8c\x16A\x04\xba\x89d\x80"\x06\xec\xda:\xa9\x85\xe4TvE\xb2\x9c)\xcaf\x84
....
Если всякие \x89 и проч спокойно можно привести к виду 01010101, то как быть например с "PNG", "w=", "\r", "{P", "LED" и прочими словами, встречающимися в выводе?

Буду рад любой помощи.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.04.2013, 10:30
Ответы с готовыми решениями:

Вывод любого файла в виде последовательности нулей и единиц в memo
Задача поставлена следующим образом: открыть файл любого расширения и вывести его представление в виде битового потока на экран (в memo),...

Перевод бинарного изображения в массив из нулей и единиц
Доброго времени суток. Чтоб в ручную не составлять массив перенося пиксели из бинарного изображения, попробовал найти функцию, которая...

Дана строка, состоящая из групп нулей и единиц. Посчитать количество нулей и единиц
Приветствую всех! Нужна помощь с кодом по VB Дана строка, состоящая из групп нулей и единиц. Посчитать количество нулей и единиц. Как...

12
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
16.04.2013, 12:02
А в чём проблема? Любой из указанных символов можно записать с помощью его кода.
Например '\r' это то же самое, что '\x0d'
'PNG' можно записать как '\x50\x4e\x47'
Не важно как представлен символ, функция ord() всё равно вернёт его числовой код.
0
2 / 2 / 2
Регистрация: 16.04.2013
Сообщений: 15
16.04.2013, 12:09  [ТС]
Тогда такое уточнение:
Чтобы получить код каждого символа, мне нужно "\x25" передать одной функции, а "PNG" - другой, как это сделать с наименьшими потерями? Нужно же распарсить всю эту строку и то, что попадает под шаблон "\x**" - в одну сторону, что нет - в другую?
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
16.04.2013, 12:30
Нет. Все четыре указанных символа хранятся в памяти в виде числовых кодов. Это отображение на экране у них разное.
Python
1
2
for s in "\x25PNG":
    print bin(ord(s))
Результат:
0b100101
0b1010000
0b1001110
0b1000111
1
2 / 2 / 2
Регистрация: 16.04.2013
Сообщений: 15
16.04.2013, 12:37  [ТС]
Спасибо большое, буду пробовать
0
2 / 2 / 2
Регистрация: 16.04.2013
Сообщений: 15
23.04.2013, 01:24  [ТС]
Столкнулся с новой проблемой:
формирую нужную мне для записи строку, записываю в бинарном режиме в файл, вижу, что записывается 1276 байт(столько, сколько и должно), но размер файла на выходе = 1902 байта, соответственно, он не открывается так, как должен.

Python
1
2
3
4
5
6
def write_bin(path, STRING):
    DECODED_STRING = ""
    with open(path, "wb") as OUT_FILE:
        for i in range(0, len(STRING)):
            DECODED_STRING = DECODED_STRING + chr(int(STRING[i], 2))
        OUT_FILE.write(bytes(DECODED_STRING, "UTF-8"))
STRING = ['00101100', '10010111', ...

Добавлено через 21 час 44 минуты
Ребят, неужели никто ничем не может помочь?
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
23.04.2013, 01:41
Так вроде ничего удивительного:
Code
1
2
3
4
>>> bytes("abc", "UTF-8")
b'abc'
>>> bytes("абв", "UTF-8")
b'\xd0\xb0\xd0\xb1\xd0\xb2'
Или что-то не понятно? Кодировка UTF-8 подразумевает, что для кодирования различных символов может использоваться разное количество байт. От одного до четырёх.
0
2 / 2 / 2
Регистрация: 16.04.2013
Сообщений: 15
23.04.2013, 03:02  [ТС]
Это понятно.
Собственно, глобальный вопрос в том, как считать файл(не текстовый), а потом, грубо говоря, записать его в первозданном виде, чтобы, если это png - он открывался как png, если mp3 - как mp3 и т.д.
Считывание работает идеально, все преобразования, нужные мне, так же работают, как в одну, так и в другую сторону. Но вот с тем, чтобы записать файл в том же исходном виде назад - проблема.
Пробовал тот метод, который привел выше - он работает не так, как надо, откуда-то берутся лигние байты. Кто-нибудь может подсказать работающий метод? Или объяснить, что не так в этом?
0
224 / 209 / 63
Регистрация: 26.05.2011
Сообщений: 363
23.04.2013, 04:45
Цитата Сообщение от vebeer Посмотреть сообщение
Столкнулся с новой проблемой:
формирую нужную мне для записи строку, записываю в бинарном режиме в файл, вижу, что записывается 1276 байт(столько, сколько и должно), но размер файла на выходе = 1902 байта, соответственно, он не открывается так, как должен.

Python
1
2
3
4
5
6
def write_bin(path, STRING):
    DECODED_STRING = ""
    with open(path, "wb") as OUT_FILE:
        for i in range(0, len(STRING)):
            DECODED_STRING = DECODED_STRING + chr(int(STRING[i], 2))
        OUT_FILE.write(bytes(DECODED_STRING, "UTF-8"))
STRING = ['00101100', '10010111', ...

Добавлено через 21 час 44 минуты
Ребят, неужели никто ничем не может помочь?
Python
1
2
3
4
5
6
7
8
9
from array import array
from functools import partial
 
STRING = ['00101100', '10010111', ...
 
basetwo = partial(int, base=2)
data = array("B", map(basetwo, STRING))
with open(path, "wb") as OUT_FILE:
    data.tofile(OUT_FILE)
Добавлено через 13 минут
Python
1
2
3
# байты файла в двоичном виде можно так получить
with open(source, "rb") as fin:
    BINDATA = list(map("{:08b}".format, map(ord, f)))
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
23.04.2013, 05:41
Цитата Сообщение от vebeer Посмотреть сообщение
Или объяснить, что не так в этом?
при обработке бинарных файлов вообще нет понятия кодировки, следовательно, наличие у тебя там utf-8 уже говорит, что ты что-то не то делаешь

Цитата Сообщение от pyuser Посмотреть сообщение
Python
1
# байты файла в двоичном виде можно так получить
у него третий питон, итератор изменился
Python
1
2
3
4
5
>>> f = open('/etc/passwd', 'rb')
>>> next(f)
b'root:x:0:0:root:/root:/bin/bash\n'
>>> f.close()
>>>
vebeer, для работы с файлом тебе нужны только .read() и .write()
0
224 / 209 / 63
Регистрация: 26.05.2011
Сообщений: 363
23.04.2013, 10:34
Цитата Сообщение от accept Посмотреть сообщение
третий питон, итератор изменился
Тогда букв немного больше
Python
1
2
3
4
with open(source, "rb") as fin:
    tmp = array("B")
    tmp.fromfile(fin)
    BINDATA = list(map("{:08b}".format, tmp))
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
23.04.2013, 14:36
Цитата Сообщение от pyuser Посмотреть сообщение
Тогда букв немного больше
а array для чего?
Python
1
2
3
4
5
6
7
8
>>> f = open('/etc/passwd', 'rb')
>>> s = next(f)
>>> s
b'root:x:0:0:root:/root:/bin/bash\n'
>>> s[0]
114
>>> f.close()
>>>
0
2 / 2 / 2
Регистрация: 16.04.2013
Сообщений: 15
24.04.2013, 02:25  [ТС]
Цитата Сообщение от pyuser Посмотреть сообщение
Python
1
2
3
4
5
6
7
8
9
from array import array
from functools import partial
 
STRING = ['00101100', '10010111', ...
 
basetwo = partial(int, base=2)
data = array("B", map(basetwo, STRING))
with open(path, "wb") as OUT_FILE:
    data.tofile(OUT_FILE)
Огромное спасибо! Это именно то, что нужно, работает на "ура"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.04.2013, 02:25
Помогаю со студенческими работами здесь

Дана строка, состоящая из групп нулей и единиц. Посчитать количество нулей и единиц
Дана строка, состоящая из групп нулей и единиц. Посчитать количество нулей и единиц.

Записать последовательность нулей и единиц в виде байтов
Здравствуйте, очень нужна помощь. Есть список нулей и единиц, и нужно их преобразовать в виде байтов, что бы получить исходный файл. Как...

Получить двоичное представление числа р в виде последовательности нулей и единиц
Дано натуральное число р. Получить двоичное представление числа р в виде последовательности а0, ...,аn нулей и единиц такой, что...

Считывание бинарного файла
Здравствуйте! Изначально нужно было прочитать почисленно текстовый файл и забить его в массив. Но т.к. это не получилось, решил прочитать...

Считывание из бинарного файла
СЧИТАТЬ ИЗ БИНАРНОГО ФАЙЛА ВСЕ ВЕЩЕСТВЕННЫЕ ЧИСЛА В МАССИВ И ВЫВЕСТИ ЕГО НА ЭКРАН. #include <iostream> #include <fstream> ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru