Ищу штуку для получения и ввода "с листа" распечаток дампов с проверкой контрольных сумм построчно под linux
Ищу штуковину, которая позволит вводить с бумаги дампы с подсчётом построчных контрольных сумм. Раньше такие дампы печатались в журналах типа "Радио", выглядят примерно так:
B3 F2 65 0D 82 CF 46 99 71 3A 99 53 7C 78 C5 B7 22 DE 61 AF E4 99 A5D255
A6 3D 4E 95 0D 3E C6 01 63 CE BE CE 84 F6 CD D3 54 61 8C F9 5B 94 CF045C
где последние три байта — CRC24 данной строки, но может быть и CRC16, и однобайтовая контрольная сумма.
Понятно, что при вводе ручками с бумаги без построчной сверки контрольных сумм искать ошибки ввода практически нереально. Тем более странно, что стандартных юниксовых инструментов, предлагающих такую функциональность, я не обнаружил, хотя маны по od и hexdump почитал довольно внимательно. Думал, что такого рода инструменты должны были писа́ться для операционной системы ещё до написания ассемблера.
Ответы (1 шт):
На всякий случай, написал небольшое решение на Cи которое можно расширять.
- Компиляция:
gcc viewer_chsum.c -o viewer_chsum - Запуск:
./viewer_chsum file_path/file_nameнапример:./viewer_chsum test
пример файла:
:10010000214601360121470136007EFE09D21901
:100110002146017E17C20001FF5F160021480119
:10012000194E79234623965778239EDA3F01B2CA
:100130003F0156702B5E712B722B732146013421
:00000001
вывод (чек-сумма отделена пробелом):
:10010000214601360121470136007EFE09D21901 40
:100110002146017E17C20001FF5F160021480119 28
:10012000194E79234623965778239EDA3F01B2CA A7
:100130003F0156702B5E712B722B732146013421 C7
:00000001 FF
За основу подсчета чексуммы взята статья из wiki
Исходник viewer_chsum.c:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int hex_to_dec(char * ch){
char str[] = "0123456789ABCDEF";
return (int)(strchr(str, ch[0])-&str[0]) << 4 | strchr(str, ch[1])-&str[0];
}
unsigned int get_chksm(int s){
return (unsigned int)(~s + 1) & 0xff;
}
void read(char * file){
FILE * fp;
char * line = NULL;
size_t len = 0;
ssize_t read;
int i = 0;
int sum = 0;
fp = fopen(file, "r");
if (fp == NULL){
printf("file \"%s\" not found\n", file) ;
exit(EXIT_FAILURE);
}
while ((read = getline(&line, &len, fp)) != -1) {
i = sum = 0;
for (i = 3; i < strlen(line); i += 2){ // skip :dd
sum += hex_to_dec(&line[i]);
}
line[(int)strcspn(line, "\r\n")] = 0; // remove new line
printf("%s %X\n", line , get_chksm(sum)) ;
}
fclose(fp);
if (line)
free(line);
}
int main(int argc, char *argv[])
{
if (argc < 2) {
printf("%s\n", "need an INTEL HEX file as argument");
return 0;
}
read(argv[1]);
return 0;
}