IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Как записать в файл 12 битные данные? (https://www.imho.ws/showthread.php?t=104868)

Rundll 14.06.2006 17:41

Как записать в файл 12 битные данные?
 
Всем привет!

Никогда ранее не сталкивался с такой проблемой, как запись в файл 12 битных (или других нестандартных данных) данных. Использую контейнер bitset<12>, но его размер...4 байта... Да и вобще при использовании функции fread и fwrite размер принимается в виде целочисленных аргументов, а у мне получается необходимо 1,5 байта на данное... Буду очень благодарен за помощь!

_Lynx_ 14.06.2006 17:44

Записывай пакетами из нескольких блоков, опять же меньше обращений к диску.

Rundll 14.06.2006 17:52

Я тоже так думал, спасибо, попробую сделать!

Kvarx 14.06.2006 18:46

Либо записывай 2 байта, из них значащих будут только 12 бит.

Или например, 2 твоих 12 битных блока влезают в 3 байта.

Тебе понадобится использование масок и операций XOR, OR, AND.

Rundll 15.06.2006 10:53

В принципе обошёлся чисто логическими сдвигами, всё работает :)

sflash 12.07.2006 08:00

Цитата:

В принципе обошёлся чисто логическими сдвигами, всё работает
Мне кажется просто будет быстрее если писать просто по слову (16 б) из которых рабочие 12, IMHO скорость намного выше

ktulu 12.07.2006 23:50

sflash

Да, конечно, и быстрее, и проще, но весь прикол 12-битных данных в том, что они пишутся ПО ПОРЯДКУ, как и любые другие. А если оставлять 4 бита незанятыми (предположим, старшие), то это просто числа от 0 до 4095 в 16-ричном формате. Пример - номера кластеров в FAT12/FAT16. В FAT12 номер кластера - 12-битный и его без масок и/или сдвигов просто не прочитать, ну и, соответственно, не записать. И хотя процедура получения 12-битного числа таким образом (сдвиги и т.д.) намного ниже, чем прямое чтение 2 байт, с этим приходится считаться и читать/писать именно по 12 бит, не пропуская 4 бита после каждого числа :cool:

crawler 13.07.2006 15:59

ktulu сказали же пиши 16 бит, а не 2 по 8. Тогда у тебя может быть записано число в диапозоне 0-65535, из которых верхние 4 бита всегда будут нулями.

Цитата:

short x[10];
....
x[0]=0xFFF;
x[9]=0x123;
...
fwrite(x,2,10,fid);
...// 2 это размер одного члена в байтах

ktulu 13.07.2006 16:04

Мне-то все понятно, я объясняю по поводу того, почему нельзя
Цитата:

Мне кажется просто будет быстрее если писать просто по слову (16 б) из которых рабочие 12, IMHO скорость намного выше
А мне это уже приходилось пройти, так что :beer:

PSyton 14.07.2006 06:40

А про упаковку перед записью кто-нибудь слышал? Типа объединения 2-х 12-битных блоков в 3 байта? Да и писать/читать лучше не по 1-2 байта за раз а пакетами по килобайту и т.п. Вот это действительно увеличит скорость. (реальное чтение/запись происходит покластерно, а то и большими кусками) Разбирать чего там начиталось в памяти будет на несколько порядков быстрее чем читать мелкими кусками.
В конце-концев вокруг этого всего можно (и нужно) написать прозрачную обертку, которая на верхнем уровне будет оперирровать 12-битными данными а вниху как угодно.


Часовой пояс GMT +4, время: 20:58.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.