2012-03-27 62 views
3

我想了解ID3標籤是如何工作的,所以在閱讀了一些文檔後,我開始看一些mp3的原始數據。 Vim的通常是我的首選編輯器,因此,一些谷歌上搜索後,我發現我可以使用XXD通過調用Vim修改一個文件,如果與xxd一起使用

:%!xxd 

一切正常,看我的文件的十六進制表示,但是當我把一切都回到以與

:%!xxd -r 

並退出,我發現該文件被修改; vlc不能再播放它,並且diff會告訴我文件不同。我以爲我偶然修改了一些東西,但進一步的實驗表明,即使打開文件並使用xxd,然後xxd -r也會以某種方式更改文件。

這是爲什麼?我怎樣才能防止它發生?難道我做錯了什麼?

回答

6

顯然,如果你不打算改變任何文件,你可以使用:q!退出vim

As @RunHolt指出,vimxxd可以更改二進制文件。例如將LF更改爲CRLF或在文件末尾附加LF字符。

您可以通過設置選項binary防止這種情況:

要麼開始vim爲:vim -b filename或將文件加載到緩衝區之前鍵入:set binary

+0

通過使用二進制選項一切工作正常。是的,我知道我可以使用:q!退出,但主要想法是能夠通過vim修改文件,所以我必須找到一種方法來保存文件,如果有必要。非常感謝你! – Odexios 2012-03-27 20:06:35

+0

@Odexios:不客氣。我可能不應該提到':q!'命令,但你永遠不知道,有時候最明顯的事情是最難找到的。 – 2012-03-27 20:18:53

1

在windows二進制文件(不確定其他平臺)上,:%!xxd將文件結束標記放在最後兩個字節(0x0d,0x0a)中。由於某種原因,%!xxd -r不會刪除它們。

我經常手動刪除它們(只要刪除這兩個字符不是運行%!xxd -r

可能是東西,可以直接與xxd固定。

+0

我正在使用Linux機器;我對原始數據編輯是最新的,所以我只是試圖盲目地遵從你的建議。我在流的末尾發現了一個0x0a(雖然沒有0x0d),但刪除它並沒有改變任何東西。好吧,我想它改變了一些東西XD無論如何,我試圖用差異來看看差異在哪裏,顯然有很多字節已被改變。 – Odexios 2012-03-27 19:59:15

2

您可能沒有將該文件作爲二進制文件加載到vim -b。即損害已經完成。

xxd這裏是紅鯡魚; xxd其次是xxd -r透明。它旨在用於編輯二進制文件。 xxd不添加任何字節;它會產生一個精確的hexdump,這個數字會被xxd -r正確反轉(除非你破壞它)。通過xxd通過xxd -rvim -b和過濾

$ xxd binaryfile | vim -  # just use vim as a reader 

我已經編輯可執行文件和回:

只能查看,只需從shell中運行xxd。他們跑得很好。

此外,xxd是Vim發行版附帶的Vim特定程序。知道od,例如,你可能會很有用。g

od -tx1 file 
+0

不知道!另外,你可以在文件已經打開之後('xxd'之前)設置bin。 – RunHolt 2012-03-28 12:20:19

相關問題