Что означает ^ @ ^ @ ^ @ в текстовом файле?

Иногда у меня возникают проблемы с открытием файла с помощью графического текстового редактора – я использую geany . Файл может быть прочитан vim без проблем. Я проверил файл, и в нем не было ничего плохого, кроме некоторых строк. Это, например, файл .bash_history :

  776 reboot 777 ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@geany /etc/fstab .... .... 823 reboot 824 ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@exit 

Я не знаю, что такое ^@ , но после удаления каждой строки, имеющей его, файл можно снова прочитать в geany . Может быть, операция перезагрузки должна что-то с этим сделать? Но у меня есть другие записи reboot в файле, а символы ^@ появляются только в двух или трех местах.

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

Кто-нибудь знает, что означает ^@ , откуда оно взялось, и почему у vim нет проблем с чтением файла, тогда как geany не может его прочитать вообще?

Когда когда-либо у вас есть случайные символы в файле, вы можете заручиться поддержкой инструментов od или hexdump .

Примеры

Сначала мы покажем, что показывает восьмеричный дамп ( od ), когда мы говорим ему, чтобы сбросить содержимое файла a.txt в шестнадцатеричном формате ( -x ).

О.Д.

 $ od -x a.txt 0000000 3737 2036 6572 6f62 746f 370a 3737 0020 0000020 0000 0000 0000 0000 0000 0000 0000 0000 * 0000140 0000 0000 0000 0000 0000 0000 0000 6567 0000160 6e61 2079 652f 6374 662f 7473 6261 380a 0000200 3332 7220 6265 6f6f 2074 380a 3432 0020 0000220 0000 0000 0000 0000 0000 0000 0000 0000 * 0000320 7865 7469 000a 0000325 

Мы можем использовать hexdump чтобы сделать что-то подобное, показывая данные в шестнадцатеричном формате, однако он также покажет значение как символ ASCII, если это возможно.

шестнадцатеричного

 $ hexdump -C a.txt 00000000 37 37 36 20 72 65 62 6f 6f 74 0a 37 37 37 20 00 |776 reboot.777 .| 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 67 65 |..............ge| 00000070 61 6e 79 20 2f 65 74 63 2f 66 73 74 61 62 0a 38 |any /etc/fstab.8| 00000080 32 33 20 72 65 62 6f 6f 74 20 0a 38 32 34 20 00 |23 reboot .824 .| 00000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 000000d0 65 78 69 74 0a |exit.| 000000d5 

Глядя на вышесказанное, вы увидите несколько последовательностей 00 00 00 . Это те ^ @ персонажи, о которых вы спрашивали.

Кстати, символ 00 является нулевым символом.