`wc -c` дает непредвиденные результаты?

У меня есть файл.log, который является двоичным файлом (BSC0000.log). Так что просмотрел его в программе просмотра HEX (OKteta) и экспортировал прямо в строку (split_space.txt). С пробелами в середине, как 00 DF 00 45,

Дело в том, что когда я посчитал символы в обоих файлах, это показало огромную разницу.

laksith@laksithPC:~/Desktop/test$ cat split_space.txt | wc -c
31617470
laksith@laksithPC:~/Desktop/test$ cat BSC0000.log | wc -c
10539157

Можно предположить, что это может быть из-за пробелов между ними. Но тогда это должно быть примерно как 10539157 + 10539157/2, но как получается, что это значение 31617470.

но 10539157 * 3 = 31617471, это значение из командной строки +1

1 ответ

Решение

Байт имеет 8 бит. Поскольку шестнадцатеричный код использует 16 символов 0-9a-f, он может отображать только четыре бита на символ. Для отображения одного байта требуется два шестнадцатеричных символа. Добавьте к этому, что большинство символов в шестнадцатеричном отображении имеют пробел после них, и вы видите, почему шестнадцатеричное отображение занимает в три раза больше байтов, чем двоичный файл.

пример

Давайте создадим файл, содержащий один байт:

$ printf 'a' >afile
$ wc afile
0 1 1 afile

Теперь давайте отобразим это, например, hexdump -C:

$ hexdump -C afile
00000000  61                                                |a|
00000001

a символ является символом ASCII 61 (Шестнадцатеричный). Один байт в файле принимает два символа для отображения в шестнадцатеричном формате (и три, если в шестнадцатеричном есть пробел после него).

Другие вопросы по тегам