akor168: (Default)
[personal profile] akor168
Вопрос по программированию от неспециалиста. Вот я хочу прочитать файл в С и проинтерпретировать его весь как запись большого двоичного числа. Какие подводные камни могут быть?

Например, я открываю файл в N байт, и считываю его побайтово как символьный массив типа char длины N. Потом смотрю битовое представление каждого символа, и формирую массив из нулей и единичек длины 8*N. С которым я потом работаю, как с большим двоичным числом в 8*N разрядов. Результат алгоритма у меня условно говоря двоичное чиcло размерности 8*M. Я его делю на блоки по 8 бит, формирую обратно новый символьный массив в М байт. И записываю это все дело в файл.

Что может пойти не так?

Date: 2014-05-14 12:52 pm (UTC)
From: [identity profile] birdwatcher.livejournal.com
Потратите время на написание и отладку кода, имеющегося в библиотеках.
Например, https://gmplib.org

Date: 2014-05-14 01:07 pm (UTC)
From: [identity profile] akor168.livejournal.com
Я планирую использовать это. Но фишка то в том, что у меня свой адженда того что я собираюсь делать над данными большими числами, и эти операции не стандартные.

Я не смотрел детально, если в том пакете есть функция которая делает за меня эту работу - то есть преобразовываем файл в число то я буду рад.

Date: 2014-05-14 01:12 pm (UTC)
From: [identity profile] birdwatcher.livejournal.com
https://gmplib.org/manual/I_002fO-of-Integers.html

Date: 2014-05-14 02:41 pm (UTC)
From: [identity profile] akor168.livejournal.com
Ага, вижу то есть из файла читается в ихнее число-структуру.

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

Date: 2014-05-14 02:49 pm (UTC)
From: [identity profile] birdwatcher.livejournal.com
https://gmplib.org/manual/Integer-Import-and-Export.html

Date: 2014-05-14 03:06 pm (UTC)
From: [identity profile] akor168.livejournal.com
Большое спасибо. Засяду за изучением мануала наверное, тогда, этой библиотеки. Может правда ничего велосипедить не придется.

Date: 2014-05-14 01:26 pm (UTC)
From: [identity profile] ilya-dogolazky.livejournal.com
речь о "работе" на дюжину строк на Си, уж не знаю, в чём "ваш адженда", но рискну предположить, что запись/чтение файла там займёт пренебрежимо мало "работы" в сравнении с остальными делами

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

Date: 2014-05-14 02:21 pm (UTC)
From: [identity profile] akor168.livejournal.com
Мне строго говоря, желательно именно двоичные биты, одна и та же битовая строка может интерпретируема многими способами в алгоритме, и там идет по сути последовательное применение этих способов с идеей найти оптимальный.

Потому то преобразование данных в эту самую двоичную строку мне нужно. Причем по большому счету достаточно любого осмысленного биективного преобразования(то есть когда по строке я могу однозначно восстановить исходные данные и наоборот).

Date: 2014-05-14 06:49 pm (UTC)
From: [identity profile] ilya-dogolazky.livejournal.com
вы путаете разные вещи --- представление в памяти (это уж как вам удобно, согласно "вашей аженды") и представление в файле (это именно то, для чего десятичные цифры удобны при работе с ГМП)

впрочем раз вам важно конкретное представление в памяти, то конечно ГМП не годится

Date: 2014-05-14 01:01 pm (UTC)
From: [identity profile] oho.livejournal.com
тока unsigned char, а не char

а про GMP вам уже написали ...
Edited Date: 2014-05-14 01:01 pm (UTC)

Date: 2014-05-14 01:08 pm (UTC)
From: [identity profile] akor168.livejournal.com
Да, спасибо, именно unsigned лучше.

Date: 2014-05-14 02:42 pm (UTC)
From: (Anonymous)
Что до подводных камней, то во-первых, ежели вы это пишете под виндами, то по дефолту 2 последовательных символа возврата каретки и перевода строки будут восприниматься как один. Поэтому файл нужно открывать в бинарном моде.


Если файл состоит из нулевых символов, то независимо от его длины он будет собой представлять для вас одно и то же двоичное число. Та же проблема если он оканчивается на нулевые символы. Вопрос - подходит ли вам это.

Date: 2014-05-14 04:23 pm (UTC)
From: [identity profile] psilogic.livejournal.com
Может быть неудобно работать с самим файлом - там же фактически произвольные символы могут быть, так что в текстовом редакторе не посмотришь, "на глаз" результат не оценишь. Поэтому советую юзать текстовый файл из символов '0'/'1' - хоть он и будет занимать больше места, но нагляднее, и алгоритмы чтения/записи упростятся - простое добавление или вычитание '0' из каждого байта после чтения прямиком в массив.

Date: 2014-05-14 07:48 pm (UTC)
From: (Anonymous)
Да.
Бинарные форматы файлов - рудимент, оставшийся от эпохи высоких цен на память и низкого быстродействия процессоров и систем передачи данных.
К тому же текст прекрасно зипуется и раззиповывается налету. Это если число будет действительно большим.

Profile

akor168: (Default)
akor168

December 2016

S M T W T F S
     12 3
4 5678 9 10
1112 1314 151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 20th, 2025 03:24 am
Powered by Dreamwidth Studios