Побитовое описание

rafael

Новичок
Необходимо научиться читать бинарный файл, есть небольшая инструкция и сам файл. Больше ничего нет.
В инструкции написано, что следующие два байта имееют формат:
MMDDv
, где:
M = month of year
D = day of month
v = the tens digit

Судя по формату понятна последовательность данных. Но не понятно сколько бит занимает месяц года, день месяца и оставшееся (труднопереводимое) значение.
Я могу догадываться, что месяцу года нужно максимум 4 бита (0-11), дню месяца 5 бит (0-30), ну и (возможно) числу от 0 до 99 - 7 бит. В итоге так и получается = 16 бит (2 байта).

Но такое наивное рассуждение не действует для чтения следующих данных - размер: 1 байт, формат:
SSv
, где:
SS = number of servers
v = hundreds digit

Как ни крути, корректную логику построить не удаётся. Мне кажется, что ключ к разгадке кроется в формате. Не зря некоторые значения дублируются и обознаются заглавными и строчными буквами. В гугле не нашлось.

Может кто знает, как интерпретировать такие форматы?

Суть вопроса: как, исходя из формата, например "MMDDv" (16 бит) или "SSv" (8 бит) можно понять какой бит к чему относится? Вот ещё пример: sCCCCCaAAAAAgGGGGGSS (8 байтов = 64 бита, значений - 7)

На мой взгляд на вопрос может быть два варианта ответа:

1. Такие форматы читаются на основе инструкции, доступной по ссылке [волшебная ссылка]. тебе там станет всё ясно.
2. Инструкция содержит не полную информацию, по предоставленным данным действительно не понятно как читать файл.
 

Активист

Активист
Команда форума
Кажется Вы путаете понятие байт и бит.

Судя по докам - у вас 5 байт, первые два - месяц, следующие два - день недели, а v - один байт, скорее всего - типа char

Хотя в два байта можно засунить и месяц и день.
 

rafael

Новичок
Простите, но, по-моему, вы не правы. Вы меня запутали ещё больше. И пока не пойму ваш ответ.

На мой взгляд на мой вопрос может быть два варианта ответа:

1. Такие форматы читаются на основе инструкции, доступной по ссылке... тебе там станет всё ясно.
2. Инструкция содержит не полную информацию, по предоставленным данным действительно не понятно как читать файл.
 

Активист

Активист
Команда форума
А, теперь понял)) Ну да, два байта - подходит.

> SS = number of servers
> v = hundreds digit

А в чем суть вопроса? В том что ошибка в доке? SSv - не один байт, а два (судя по описанию).
 

rafael

Новичок
Суть вопроса: как, исходя из формата, например "MMDDv" (16 бит) или "SSv" (8 бит) можно понять какой бит к чему относится?
 

rafael

Новичок
Вот ещё пример: sCCCCCaAAAAAgGGGGGSS (8 байтов = 64 бита, значений - 7)
 

rafael

Новичок
date_vv (2 bytes)
MMDDv
where:
M = month of year
D = day of month
v = the tens digit.

Так легче? По-моему приведённой информации достаточно
 

Активист

Активист
Команда форума
Что за дока кстати?

Чтоб не скучно было заходить:
PHP:
/*
 * 2hex
 */
$month = 12 << 12;
$day = 30 << 7;
$year = 11;
echo dechex($month | $day | $year); // 0xcf0b

/**
 * 2date
 */
$month = 0xcf0b >> 12 & 0xffff;
$day = 0xcf0b >> 7 & 0x0ff >> 3 ;
$year = 0xcf0b & 0x00ff >> 1;
echo $month."/".$day."/".$year; // 12/30/11
 

Активист

Активист
Команда форума
Судя по гуглу - сей формат известен только самому автору этой доки, может быть к нему обратиться?
 

rafael

Новичок
Так. Ну я хоть стал уверенней в том, что нет никакого общего формата, по представлению побитовых масок. И действительно придётся обратиться к авторам инструкции.

Активист, спасибо.
 

Активист

Активист
Команда форума
Кстати, могу предположить

DDMM - это &0xff и &0x00ff (два байта, 0xf -. 4 бита, одна шестнадцатеричная единица), v - скажем - ожидаемые данные.
SSv = это 0xff (v) ожидаемые данные.

Вот только под вот это ничего не подпадает: sCCCCCaAAAAAgGGGGGSS, что там написано относительно этой строки?
 

rafael

Новичок
Да, я поторопился. Рано обрадовался. Функция unpack тут не поможет. В форматах присутствуют такие шаблоны как "M" и "g" , которые не поддерживаются функциями pack/unpack. Ни php, ни perl. Но вот выдержка из инструкции:

All of the values are stored as unsigned numbers. The bytes are ordered in little endian. The 8 byte values are unsigned long long in C and C++ or UInt64 in C#.

Вот пример данных из файла:

11111000 00000111

Вот описание этих данных:

date_vv (2 bytes)
MMDDv
where:
M = month of year (февраль)
D = day of month (четвёртое число)
v = the tens digit (цифра от 0-9)

Не понимаю, как можно тут "11111000 00000111" или тут "00000111 11111000" (поменял местами байты - см. little endian) прочесть 4-ое февраля ?
 

rafael

Новичок
Помог свежий взгляд фрилансера. форматы "MMDDv" означал что при переводе байтов ("00000111 11111000") в десятичную систему счисления (2040) нужно было применять это число к формату. То есть дописать еще одинок нолик в переди (02040) и разделить цифры по их позициям

MM = 02
DD = 04
v = 0

Такая же логика в "sCCCCCaAAAAAgGGGGGSS" (8 байт)
 
Сверху