2013-07-04 50 views
2

我怎樣做那樣簡單(在PHP)這個東西代碼C:真正二進制寫PHP

char buffer[5] = "testing"; 
FILE* file2 = fopen("data2.bin", "wb"); 
fwrite(buffer, sizeof buffer, 1, file2); 
fclose(file2); 

每當我試着用PHP編寫一個二進制文件,它不會在實際二進制寫。

例子:

$ptr = fopen("data2.bin", 'wb'); 

fwrite($ptr, "testing"); 

fclose($ptr); 

我上網,我需要使用pack()做到這一點上找到...

我期待什麼:

testing\9C\00\00 
or 
7465 7374 696e 679c 0100 00 

什麼我:

testing412 

謝謝

+0

是什麼讓你覺得它不是用「真正的二進制」寫的?那是什麼意思? – Barmar

+0

你是什麼意思「它不寫在真正的二進制」?你期待的結果是什麼,你得到了什麼? –

+0

我期待得到像4d61 7572 6963 696f 0063 ecbf 855a 61b7 00d6 7bb7 1200 0000 00ba 7f47這樣的東西,但我只能得到像普通文本文件一樣的明文。 –

回答

4

您正在使數據數據與該數據的表示混淆的經典錯誤。

假設你有一個文本文件。如果您在記事本中打開它,你會看到以下內容:

hello 
world 

這是因爲記事本假定的數據是ASCII文本。因此,它需要原始數據的每個字節,將其解釋爲ASCII字符,並將該文本呈現給屏幕。

現在,如果你去打開該文件用十六進制編輯器,你會看到完全不同的東西:

68 65 6c 6c 6f 0d 0a 77 6f 72 6c 64   hello..world 

這是因爲十六進制編輯器,而不是取原始數據的每個字節,並將其顯示爲兩個字符的十六進制數字。

1 - 假設Windows \r\n行結束和ASCII編碼。


所以,如果你期待十六進制ASCII輸出,你需要轉換您的字符串的十六進制編碼寫它之前(爲ASCII文本!)的文件。

在PHP中,您正在尋找的是bin2hex函數,它返回一個包含str的十六進制表示的ASCII字符串。例如:

$str = "Hello world!"; 
echo bin2hex($str);  // output: 48656c6c6f20776f726c6421 

注意,"wb" mode參數不會引起任何特殊的行爲。它保證二進制輸出,而不是十六進制輸出。我不能強調,有什麼區別。 b真正做的唯一事情是確保在讀取/寫入數據時線路結尾不會被庫轉換。

+0

謝謝!但爲什麼PHP不這樣做呢?在C中,如果我將「wb」作爲參數放在fopen中,它將所有內容都保存爲二進制文件......但在PHP中,它似乎只是被忽略。 –

+0

@MaurícioGiordano不,C絕對不會做你剛剛描述的。請編譯並運行您的C代碼,並在*文本編輯器*中打開結果。你會看到ASCII。 ''wb「'模式不會**做你認爲它做的事情。 –

+0

但它不保存在ASCII,因爲如果我打開記事本,它顯示奇怪的字符... –