固定サイズのレコードを持つバイナリファイルのレコード数を決定する方法[閉じる]

固定サイズのレコードを持つバイナリファイルのレコード数を決定する方法[閉じる]

バイナリファイルのレコード数を確認しようとしています。バイナリファイルのサイズはwc -c。区切り文字が不明です。レコードサイズは固定されています。各レコードの正確なサイズがわかりません。レコード数を確認したい。

答え1

この試み:

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

注:特に改行に関連するいくつかの問題を解決するには、いくつかの作業が必要だと思います。

答え2

レコード(および区切り文字)の正確なサイズがわからない場合は、シンプルでエレガントなソリューションでこの問題を解決できません。

主な警告: 区切り文字がまったくない場合(ファイルを作成するソフトウェアがレコードサイズを知っている場合は、レコードを区切り文字で区切る必要はありません)、ファイル全体が1つのレコードである可能性があるため、これは切実な状況になる可能性があります。また、場合によっては、レコード内で区切り文字として扱われる文字の前に「エスケープ文字」がある場合があります(固定レコードサイズを使用する可能性はありませんが、解析して状況をさらに悪化させる可能性があります)。しかし、「状況によって異なります」。さらに、バイナリファイル形式には、実際の録音が開始される前に「ヘッダー」ブロックがある可能性があり、これを行うにはそのサイズを知る必要があります。

しかし、希望はほとんどありません。レコードの固定サイズの長さが決まるので、タイトルがないと仮定- ファイルサイズ(から取得wc -c)は、レコードサイズとレコード数を掛けた値でなければなりません。

無差別の代入方法を試すことができます。

  1. ファイルサイズを探すwc -c(名前を指定fileSize
  2. 要因を見つけてくださいfileSize
  3. ファイルに収まるすべてのレコード数を取得できるように、すべての要素の組み合わせを見つけます。
  4. 文字の末尾で可能なレコードサイズを確認してください。仮想数字に同じ文字で終わるレコードがある場合、それは区切り文字であると考えることができます。

これは100%完璧ではありませんが、記録や文書に関するさらなる研究に役立ちます。

例:

文書の内容:

abcxdefxabnxccdxdfaxaafx
  1. ファイルサイズ:24バイト

  2. 引数::factors 242 2 2 3

  3. 可能な組み合わせ:

    • 2×12(レコード2個、それぞれ12バイト)
    • 3×8
    • 4×6
    • 6×4
    • 8×3
    • 12×2
  4. 上記の可能性ごとに区切り記号があります。

    • x
    • x
    • (異なるため、この場合は考慮しない)
    • x
    • (その他)
    • (その他)
  5. これはx区切り文字であると推測できます。可能な最小レコードサイズは状況に応じて4文字です。

これは単なる例です。別の仮定を試す必要があり、ファイルが大きい場合は、2つの同じ文字間の距離を見つけるなどの他の方法を使用できます。

関連情報