Т.е. А матчится, и тут же является длиной след. поля?
Да. Я написал чисто попробовать. А оно сработало 8) В итоге разбор FT 1.2 пакета(в сравнении с аналогичным кодом в дельфе) - по сути одна строчка. Я ее разбил на несколько только чтоб читать удобнее, иначе вылазить за край 8)
А там процедурка в 111 строк. Строго говоря, в эрланге тоже не одна строчка, а, наверное, пара десятков(ну кейсы там всякие и т.п.). Все равно разница впечатляет. Как и элегантность кода.
Ты бы код на Erlang показал который делает то же самое вообще. Было бы нагляднее. И действительно некоторых структур не хватает.
Касательно приведенного решения: 1. Fixed-length field Очевидно, основная проблема с access полем, которое может быть а может не быть. Но! Так как оно нам все равно сверху передается, то можно завести две структуры, одну с access-field, другую без. Код становится тривиальным, не находишь?
2. Variable-length field С access-field решаем так же, двумя структурами. Поле переменной длины? Ну так сделай в своей структуре массив на 256 элементов, все равно оно больше быть не может :) Затем просто сдвигаешь хвост который после данных в хвост структуры. В массиве можно обнулить ненужные поля если важно.
Попробуй ради интереса :) Интересно сколько строк получится :)
Ну и заодно вторая функция, хотя если использовать специальные структуры, получится даже проще. Просто текущая версия вызывает определенное недоумение: зачем ТРИ раза одно и то же условие проверять?
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;
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;
Comments 44
А спецзаписей я вообще не припомню где-либо (хотя я этим не сильно и занимаюсь).
Reply
Да. Я написал чисто попробовать. А оно сработало 8)
В итоге разбор FT 1.2 пакета(в сравнении с аналогичным кодом в дельфе) - по сути одна строчка.
Я ее разбил на несколько только чтоб читать удобнее, иначе вылазить за край 8)
Reply
Reply
Строго говоря, в эрланге тоже не одна строчка, а, наверное, пара десятков(ну кейсы там всякие и т.п.). Все равно разница впечатляет. Как и элегантность кода.
Reply
разве что пролог.
Reply
Касательно приведенного решения:
1. Fixed-length field
Очевидно, основная проблема с access полем, которое может быть а может не быть. Но! Так как оно нам все равно сверху передается, то можно завести две структуры, одну с access-field, другую без. Код становится тривиальным, не находишь?
2. Variable-length field
С access-field решаем так же, двумя структурами.
Поле переменной длины? Ну так сделай в своей структуре массив на 256 элементов, все равно оно больше быть не может :) Затем просто сдвигаешь хвост который после данных в хвост структуры. В массиве можно обнулить ненужные поля если важно.
Попробуй ради интереса :) Интересно сколько строк получится :)
Reply
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
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