November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags

December 26th, 2008

dil: (Default)
Friday, December 26th, 2008 08:49 pm
Задача: прочитанные их файла байтики разобрать на отдельные биты. На перле.
Пишем простенькую тестовую программу:
#!/usr/bin/perl -w

my $foo = "\x47";

for(my $i=7;$i>=0;$i--){
print vec($foo, $i, 1)." ";
}
print "\n";


Получаем ожидаемое 0 1 0 0 0 1 1 1.

Поскольку байтиков ожидается больше одного, усложняем пример. Разбираем буфер на отдельные байты в массив:
my @a = unpack("C*", $foo);

проверяем, что получилось:
printf("0x%x\n", $a[0]);
(даёт 0x47, как и ожидалось)

и повторяем процедуру извлечения битов:
for(my $i=7;$i>=0;$i--){
print vec($a[0], $i, 1)." ";
}
print "\n";

и.. получаем другой результат: 0 0 1 1 0 1 1 1

Долго бьёмся головой об стену в тщетных попытках понять, почему три бита из восьми инвертировались.

хинт к отгадке для особо любопытных )
Спасибо [livejournal.com profile] dma, а то бы я голову разбил.
dil: (Default)
Friday, December 26th, 2008 11:29 pm
To find Y, M, D from MJD
Y' = int [ (MJD - 15 078,2) / 365,25 ]
M' = int { [ MJD - 14 956,1 - int (Y' × 365,25) ] / 30,6001 }
D = MJD - 14 956 - int (Y' × 365,25) - int (M' × 30,6001 )
If M' = 14 or M' = 15, then K = 1; else K = 0
Y = Y' + K
M = M' - 1 - K × 12


И после всего этого оказывается, что годы считаются от 1900.
Да, а время к этой дате хранится в дополнительных трёх байтах. В BCD.

Вопрос: что курили разработчики стандарта EN 300 468?