Как определить количество записей в двоичном файле с записями фиксированного размера

Вы можете установить модули по альтернативному пути:

mkdir /tmp/pine64
make modules_install INSTALL_MOD_PATH=/tmp/pine64

Затем вы можете скопировать модули из /tmp/pine64и образ ядра bzImageна ваш Pine64.

Другой подход заключается в создании бинарного пакета:

make binrpm-pkg

или

make bindeb-pkg

в зависимости от вашего целевого дистрибутива. Это создаст пакет, содержащий ядро ​​и модули.

-1
17.06.2020, 13:20
2 ответа

Незнание точного размера записи (и разделителя )делает эту проблему неразрешимой с точки зрения простого и элегантного решения.

ОСНОВНОЕ ПРЕДУПРЕЖДЕНИЕ:Это может быть безнадежной ситуацией, потому что может вообще не быть разделителя (, если программа, записывающая в файл, знает размер записи, нет необходимости разделять записи разделителями )или весь файл может быть одной записью. Кроме того, в некоторых случаях перед символом, рассматриваемым как разделитель внутри записи (, может быть "управляющий символ", что маловероятно при фиксированном размере записи, но это ухудшит ситуацию при анализе ), но "это зависит". Кроме того, форматы двоичных файлов могут иметь блок «заголовка» перед началом фактической записи, и вам нужно знать его размер, чтобы это работало.

Однако надежды мало. Из-за уверенности в фиксированной длине записей, тогда-при условии отсутствия заголовка-размер файла (, полученный с помощью wc -c), должен быть произведением размера записи и количества записей.

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

  1. Найти размер файла с помощьюwc -c(позволяет назвать егоfileSize)
  2. Найдите множители fileSize.
  3. Найдите все комбинации факторов,таким образом, вы получаете все возможное количество записей, которые поместятся в файл.
  4. Проверка возможного размера записи на предмет окончания символа. Если вы найдете гипотетическое число, записи которого заканчиваются одним и тем же символом, вы можете подумать, что это разделитель.

Это не на 100% идеально, но должно немного помочь в дальнейшем исследовании записей и файлов.

ПРИМЕР:

Содержимое файла:

abcxdefxabnxccdxdfaxaafx
  1. размер файла :24 байта

  2. Коэффициенты:factors 24:2 2 2 3

  3. Возможные комбинации:

    • 2 x 12 (две записи по 12 байт каждая)
    • 3 х 8
    • 4 х 6
    • 6 х 4
    • 8 х 3
    • 12 х 2
  4. Для каждой из этих возможностей выше мы получили разделитель:

    • x
    • x
    • (разные, поэтому этот случай не рассматривается)
    • x
    • (разные)
    • (разные)
  5. Можно предположить, что xявляется разделителем, а минимально возможный размер записи составляет 4 символа, что соответствует ситуации.

Это только пример. Вы должны попробовать разные предположения, и если файл довольно большой, вы можете использовать другой подход, например, определение расстояния между двумя одинаковыми символами.

1
18.03.2021, 23:27

Попробуйте это:

script.sh:

#!/bin/bash

# read filename to var f from $1
f="$1"
# quit if file not found.
[ -f "$f" ] || { >&2 echo "File not found." ; exit 2; }
# total length of file (-1 to not count newline at the end of a file)
n=$(($(wc -c < "$f")-1))
# loop potential length of records, end at half total length of file.
for i in $(seq 1 $(awk -v n=$n 'BEGIN{print int((n/2)+0.5)-1}')); do
    # now read all delimiters regarding record length from a file
    # (see https://unix.stackexchange.com/a/276957/236063)
    # and `sort -u` to get only individual ones
    c=$(for ((j=i;j<n;j=j+i+1)); do printf '%s\n' $(dd ibs=1 skip=$j count=1 < "$f" 2>/dev/null); done | sort -u)
    # if we have exactly one individual delimiter, we're done and can print length of record and the delimiter and exit.
    if [ $(echo "$c" | wc -l) -eq 1 ]; then
        printf 'l=%s d=%s\n' "$i" "$c"
        exit 0
    fi
done
>&2 echo "No delimiter found".
exit 1

Содержаниеfile:

abc,def,ghi

Выход:

$./script.sh file
l=3 d=,

Коды выхода:

 0 success, found delimiter and record length
 1 no delimiter found
10 file not found

Примечание :Я думаю, что есть еще кое-что, чтобы исправить некоторые проблемы, особенно в отношении символов новой строки...

1
18.03.2021, 23:27

Теги

Похожие вопросы