2016-11-22 71 views
0

迄今爲止,我一直在使用程序集IBM 8086架構進行實踐,並且我收到了編寫交換任意兩行文件的程序的任務。 (我通過參數給出了這兩行的數據文件名和編號)。我的程序的算法如下:非文本格式文件中換行符的順序如何?

1)我使用有限大小的緩衝區(例如20字節大小的緩衝區)。我從文件中讀取數據到這個緩衝區,如果達到了文件結尾,不斷地檢查ax寄存器的值。

2)我將該緩衝區傳遞給檢查13d符號(CR ASCII代碼)並將緩衝區的元素傳遞到新的寫入文件緩衝區的過程,如果檢測到符號13d,則傳遞給寫入文件緩衝區停止,並且新行觸發器變量設置爲1.然後,如果找到此換行符13d符號,則調用另一個將文件指針返回到正確位置的過程(因爲我使用自定義大小的緩衝區,所以我可能會找到13d符號在緩衝區中間,所以我需要重新設置指針來糾正新行)。

因此,我的程序似乎與.txt文件正常工作,但是當我嘗試交換2個隨機行,例如.exe或.jpg文件,然後再次交換相同的行時,我無法打開該文件,因爲操作系統說它已經損壞。

我的問題是:是否可以嘗試交換任意兩行非文本格式文件,然後嘗試將其更改回來並期望新文件正常工作?這個概念理論上應該起作用嗎?或者由於各種不同的新線序列解釋(CF + NL,NL + CF等等),這樣轉換後的程序是否損壞是可以的?

換句話說:非文本文件中新行符號的解釋是什麼?他們的序列對於正確的程序操作是否重要?

感謝您的回答,如果需要我的部分代碼才能回答問題,請注意這一點。

+1

如果你的方法將使文件字節爲原始字節相同,它將工作。如果不是,那幾乎肯定不會。這是彙編語言;一切都只是字節,除非你通過一些庫函數來讀取數據,這些函數試圖爲你規範新行。我建議使用'md5sum'或'crc32'來散列文件內容,或者僅僅使用'diff'或'cmp'來對付原始內容。 (這些是unix shell命令,但是有相應的windows,並且名稱應該是顯而易見的。) –

+0

等一下,有限的緩衝區大小?所以當你找到一個「行」時,你實際上只會移動前面的18字節?嗯,取決於你如何實現它,這可能不會成爲一個問題,如果在新放置的數據開始時,行檢測將處於相同的狀態。我沒有仔細閱讀你算法的細節。 –

回答

2

可以在非文本文件中交換行。如果你做了同樣的事情兩次,你應該收到相同的二進制文件。

你不要因爲一些這樣的:

  • 有限的緩衝區大小的算法不正確處理的情況呢?在二進制文件中,很有可能打到100k +字節長度的「行」。

  • 你沒有使用二進制讀/寫API(不可能從問題中得知)?像Clib fopen這樣的文本API與模式"rt"可能會轉換一些字節值,所以文件的內容將被損壞。

什麼是新線符號非文本文件的解釋呢?

的新線符號二進制文件中的解釋可以是任何東西,包括新線符號(字符串數據時),但是從文件系統的角度來看,它只是一個字節(0 - 255)的0x0D0x0A值,像文件的其他任何字節一樣。

也許嘗試找到一些非常短的二進制文件失敗(可能是一些4096B前奏),並使用hexview或二進制比較來查看文件損壞的位置,然後在調試期間嘗試找出情況是如何發生的。

它們的序列對於正確的程序操作是否重要?

當然,如果原始二進制包含0D 0A機器代碼裏面,然後通過0D只替換它或翻轉兩0A 0D會破壞原有的機器代碼指令。如果只損害數據部分,程序可能仍然以某種方式處理損壞的數據,但隨機更改代碼需要大量運氣才能結束與原始工作幾乎一樣的工作。


看到一些代碼後:它看起來像使用int 21h文件處理服務,所以int 21h本身的工作原理與文件的二進制內容(不轉換)。

任何文件損壞都由應用程序代碼本身完成。所以你必須調試你的算法,並找出它失敗的地方,然後修復它。

+0

它實際上更像是其他方式......文件是文件,二進制字節流。然後程序代碼將這些二進制文件中的一些文件解釋爲文本文件,但這是對文件內容字節數據的代碼依賴性解釋,[common]文件系統不知道任何文本文件,將它們視爲與任何其他文件相同存儲介質。 – Ped7g

+0

感謝您的詳細回答,但是,如果您有時間瞭解我的2個過程(第一個處理每個緩衝區,第二個步驟讀取文件指針),我將非常高興:http://pastebin.com/v4vyBFBU (我正在使用基本的8086彙編指令集,沒有特殊的API)。有了這些功能,我可以得到文本文件的正確答案,但是,對於其他格式,這是一個完整的廢話。如你所說的順序很重要,執行這些程序期望文件不會被破壞是不合理的,是嗎? :) –

+0

@KasparasTaminskas沒有足夠的代碼來判斷它是否正確...但是有些部分是可疑的,例如在'Rodykles_Perkelimas'中:'cmp nuopabaigos,3''jb sitas''cmp nuopabaigos,0' .. when '(nuopabaigos == 0)','jb'將會跳轉,所以第二個cmp是無用的。而你的'cx:dx'使用表明,當新行字符的距離超過64k時,你會失敗,這可能很容易發生在像現代'.exe'這樣的大二進制文件中。總的來說,我沒有設法理解你的算法,對不起。 – Ped7g

相關問題