Программерское

Nov 01, 2009 20:56

Иногда Эрланг натурально восхищает.
Например, был удивлен, что работает вот такое вот выражение:

> = <<5,1,2,3,4,5,6>>

Интересно, а существует в каком-нибудь другом языке еще более удобный и простой разбор бинарных данных?

dev

Leave a comment

Comments 44

kurilka November 1 2009, 19:45:12 UTC
Т.е. А матчится, и тут же является длиной след. поля?
А спецзаписей я вообще не припомню где-либо (хотя я этим не сильно и занимаюсь).

Reply

side2k November 1 2009, 19:48:14 UTC
Т.е. А матчится, и тут же является длиной след. поля?

Да. Я написал чисто попробовать. А оно сработало 8)
В итоге разбор FT 1.2 пакета(в сравнении с аналогичным кодом в дельфе) - по сути одна строчка.
Я ее разбил на несколько только чтоб читать удобнее, иначе вылазить за край 8)

Reply

kurilka November 1 2009, 19:53:42 UTC
не понял про сравнение с дельфи: в эрланге строчка, а там?

Reply

side2k November 1 2009, 19:58:50 UTC
А там процедурка в 111 строк.
Строго говоря, в эрланге тоже не одна строчка, а, наверное, пара десятков(ну кейсы там всякие и т.п.). Все равно разница впечатляет. Как и элегантность кода.

Reply


kurilka November 1 2009, 19:55:26 UTC
а вообще паттерн-матчинг не только в эрланге есть, только вот из известных языков я что-то никого не вспомню :)
разве что пролог.

Reply


anonymous November 4 2009, 19:57:17 UTC
Ты бы код на Erlang показал который делает то же самое вообще. Было бы нагляднее. И действительно некоторых структур не хватает.

Касательно приведенного решения:
1. Fixed-length field
Очевидно, основная проблема с access полем, которое может быть а может не быть. Но! Так как оно нам все равно сверху передается, то можно завести две структуры, одну с access-field, другую без. Код становится тривиальным, не находишь?

2. Variable-length field
С access-field решаем так же, двумя структурами.
Поле переменной длины? Ну так сделай в своей структуре массив на 256 элементов, все равно оно больше быть не может :) Затем просто сдвигаешь хвост который после данных в хвост структуры. В массиве можно обнулить ненужные поля если важно.

Попробуй ради интереса :) Интересно сколько строк получится :)

Reply


anonymous November 4 2009, 20:42:41 UTC
Ну и заодно вторая функция, хотя если использовать специальные структуры, получится даже проще. Просто текущая версия вызывает определенное недоумение: зачем ТРИ раза одно и то же условие проверять?

body := char(controlByte);
if frame.addressed then body := body + char(frame.address)
result := char(FRAME_START_FIXEDLENGTH);

if not frame.fixedLength then
begin
body := body + BufferToStr(frame.userData, frame.userDataLength);
id := char(FRAME_START_VARLENGTH);
len := char(length(body) and $ff);
result := id + len + len + id;
end;

frame.checkSum := CheckSum(body);
frame.validCheckSum := true;

result := result + body + char(frame.checkSum) + char(FRAME_END);

Reply


anonymous November 4 2009, 20:48:01 UTC
  body := char(controlByte);
  if frame.addressed then body := body + char(frame.address)
  result := char(FRAME_START_FIXEDLENGTH);

if not frame.fixedLength then
    begin
        body := body + BufferToStr(frame.userData, frame.userDataLength);
        id := char(FRAME_START_VARLENGTH);
        len := char(length(body) and $ff);
        result := id + len + len + id;
    end;

frame.checkSum := CheckSum(body); 
  frame.validCheckSum := true;

result := result + body + char(frame.checkSum) + char(FRAME_END); 

Reply


Leave a comment

Up