imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 14.06.2006, 17:41     # 1
Rundll
Junior Member
 
Аватар для Rundll
 
Регистрация: 02.11.2003
Адрес: г. Таганрог
Сообщения: 63

Rundll Путь к славе только начался
Как записать в файл 12 битные данные?

Всем привет!

Никогда ранее не сталкивался с такой проблемой, как запись в файл 12 битных (или других нестандартных данных) данных. Использую контейнер bitset<12>, но его размер...4 байта... Да и вобще при использовании функции fread и fwrite размер принимается в виде целочисленных аргументов, а у мне получается необходимо 1,5 байта на данное... Буду очень благодарен за помощь!
__________________
Америка, Америка - это красиво, но Россия вот где есть СИЛА!!!
Rundll вне форума  
Старый 14.06.2006, 17:44     # 2
_Lynx_
Junior Member
 
Регистрация: 11.10.2005
Сообщения: 63

_Lynx_ Путь к славе только начался
Записывай пакетами из нескольких блоков, опять же меньше обращений к диску.
_Lynx_ вне форума  
Старый 14.06.2006, 17:52     # 3
Rundll
Junior Member
 
Аватар для Rundll
 
Регистрация: 02.11.2003
Адрес: г. Таганрог
Сообщения: 63

Rundll Путь к славе только начался
Я тоже так думал, спасибо, попробую сделать!
__________________
Америка, Америка - это красиво, но Россия вот где есть СИЛА!!!
Rundll вне форума  
Старый 14.06.2006, 18:46     # 4
Kvarx
Member
 
Регистрация: 26.09.2005
Адрес: Питер
Сообщения: 336

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

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

Тебе понадобится использование масок и операций XOR, OR, AND.
Kvarx вне форума  
Старый 15.06.2006, 10:53     # 5
Rundll
Junior Member
 
Аватар для Rundll
 
Регистрация: 02.11.2003
Адрес: г. Таганрог
Сообщения: 63

Rundll Путь к славе только начался
В принципе обошёлся чисто логическими сдвигами, всё работает
__________________
Америка, Америка - это красиво, но Россия вот где есть СИЛА!!!
Rundll вне форума  
Старый 12.07.2006, 08:00     # 6
sflash
Junior Member
 
Аватар для sflash
 
Регистрация: 25.09.2003
Сообщения: 53

sflash Косячил раньше, старается исправиться
Цитата:
В принципе обошёлся чисто логическими сдвигами, всё работает
Мне кажется просто будет быстрее если писать просто по слову (16 б) из которых рабочие 12, IMHO скорость намного выше
sflash вне форума  
Старый 12.07.2006, 23:50     # 7
ktulu
Junior Member
 
Аватар для ktulu
 
Регистрация: 21.04.2005
Сообщения: 117

ktulu Путь к славе только начался
sflash

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

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

Цитата:
short x[10];
....
x[0]=0xFFF;
x[9]=0x123;
...
fwrite(x,2,10,fid);
...// 2 это размер одного члена в байтах
crawler вне форума  
Старый 13.07.2006, 16:04     # 9
ktulu
Junior Member
 
Аватар для ktulu
 
Регистрация: 21.04.2005
Сообщения: 117

ktulu Путь к славе только начался
Мне-то все понятно, я объясняю по поводу того, почему нельзя
Цитата:
Мне кажется просто будет быстрее если писать просто по слову (16 б) из которых рабочие 12, IMHO скорость намного выше
А мне это уже приходилось пройти, так что
ktulu вне форума  
Старый 14.07.2006, 06:40     # 10
PSyton
Junior Member
 
Аватар для PSyton
 
Регистрация: 19.04.2002
Адрес: Дом
Пол: Male
Сообщения: 187

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

Опции темы

Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


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




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