2010-12-11 55 views

回答

2

字節是字節。沒有辦法聲明某些東西不是文件數據。構造一個只包含可打印的ASCII格式的有效文件相當容易。特別是在處理Unicode時,你處於非常陰暗的領域。如果可能的話,我建議修改該方法,以便它需要兩個參數...使用一個用於傳遞文本,另一個用於二進制數據。

你可能要做的一件事就是查看字符串的長度。即使對於小圖像,大多數圖像格式都至少爲500-600字節,雖然這絕不是一個準確的測試,但如果通過了,例如20k的字符串,它可能是一個圖像。如果是文字,它會相當多(類似於典型小說的四分之一左右)

+0

我同意你和我選擇的第一選擇,我想也許它更簡單。非常感謝你。 – ywenbo 2010-12-11 07:24:26

1

像圖像或聲音文件這樣的文件已經定義了可被「嗅探」的塊。 Wotsit.org有很多關於關鍵字節和確定文件的方法。通過查看數據中的這些字節偏移量,您可以找出它。

另一種方式是使用一些「魔術」,它是代碼來嗅探文件中的鍵字節或字節類型以試圖找出它的類型。 * nix系統通過file命令內置它。做一個man fileman magic欲瞭解更多信息,或查看維基百科有關Magic numbers in files的文章。

Ruby Filemagic使用相同的技術,但基於GNU的libmagic。

+0

似乎這些鏈接並不適合我的意圖。我的上下文是有一個ruby方法,它接受一個參數字符串,也許它是一個文字字符串,也許它是一個圖像blob字符串,所以我需要根據字符串的不同內容做不同的操作。事實上,如果在紅寶石中有Blob類型,我認爲也許這將解決我的問題,但我找不到它。 – ywenbo 2010-12-11 04:27:47

0

什麼構成一個字符串?你期待簡單的ASCII碼嗎? UTF-8?或者用其他方式編碼文本?

如果你知道你會得到ASCII文本或blob,那麼你可以旋轉第一個n字節,看看是否有任何東西有八位設置,這會告訴你,你有二進制。 OTOH,沒有發現任何東西並不能保證你有文字。

如果你要獲得UTF-8 Unicode,那麼你會做同樣的事情,但尋找無效的UTF-8序列。當然,同樣的注意事項也適用。

您可以掃描第一個n字節的0x00和0x20之間的任何內容。如果你發現任何字節低,那麼你可能有一些二進制的blob。但也許不是。

正如Tyler Eaves所說:字節是字節。你從一堆字節開始,試圖找到對它們有意義的解釋。

最好的辦法是讓來電者提供預期的解釋,或者採取格雷格的建議並使用神奇的號碼庫。

+0

非常感謝,最後我添加了一個更多的參數來區分。無論如何非常感謝你。 – ywenbo 2010-12-11 07:25:36

相關問題