`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
(Шестнадцатеричный). Один байт в файле принимает два символа для отображения в шестнадцатеричном формате (и три, если в шестнадцатеричном есть пробел после него).