2013-03-20 21 views
3

我在PHP中根本沒有編碼經驗。但是在爲我的Java項目尋找解決方案的同時,我發現了PHP中的一個問題的例子,這對我來說是偶然的。如何在Java中使用類似的方法轉換php解壓縮()

任何人都可以請解釋PHP的unpack('N*',"string")函數的工作和結果以及如何在Java中實現它?

一個例子會幫助我很多!

謝謝!

+0

這不是一個有效的提問方式。請先說明你想要解決的問題,然後詢問是否有可用於解決問題的解包程序。主席先生, – Danack 2013-03-20 17:20:34

+0

問題是我想了解MEGA API。一個非常有幫助的紳士已經在PHP [link] http://julien-marchand.fr/blog/using-the-mega-api-with-php-examples中解釋並實現了相同的功能。我正在使用這個信息。瞭解API並將其轉換爲JAVA以製作Android應用程序! 請幫助,如果你現在清楚的問題! :D – 2013-03-20 17:31:23

+1

我看了你鏈接的代碼,我不確定爲什麼它甚至需要在字節數組(= PHP中的字符串)和int數組之間進行轉換。事實上,我懷疑它確實沒有,至少不像現在這樣。不過,如果你確實需要這樣做,出於某種原因,請參閱下面的答案。 – 2013-03-20 18:25:03

回答

4

In PHP(和in Perl,其中PHP複製它從),unpack("N*", ...)採用一個字符串(實際上表示字節序列),並解析它的每個4字節段爲有符號的32位的大端(」 Ñ etwork byte order「)integer,將它們返回到一個數組中。

有幾種方法可以做到在Java中相同,但一個方法是從包裝輸入字節數組在java.nio.ByteBuffer,將其轉換爲IntBuffer,然後讀整數:

public static int[] unpackNStar (byte[] bytes) { 
    // first, wrap the input array in a ByteBuffer: 
    ByteBuffer byteBuf = ByteBuffer.wrap(bytes); 

    // then turn it into an IntBuffer, using big-endian ("Network") byte order: 
    byteBuf.order(ByteOrder.BIG_ENDIAN); 
    IntBuffer intBuf = byteBuf.asIntBuffer(); 

    // finally, dump the contents of the IntBuffer into an array 
    int[] integers = new int[ intBuf.remaining() ]; 
    intBuf.get(integers); 
    return integers; 
} 

當然,如果你只是想遍歷整數,你並不真正需要的IntBuffer或數組:

ByteBuffer buf = ButeBuffer.wrap(bytes); 
buf.order(ByteOrder.BIG_ENDIAN); 

while (buf.hasRemaining()) { 
    int num = buf.getInt(); 
    // do something with num... 
} 

事實上,迭代一個ByteBuffer這樣是效仿BEH的便捷方式Perl或PHP中更復雜的unpack()示例的行爲。

免責聲明:我沒有用之前測試此代碼,我相信它應該工作,但它總是可能的,我可能錯誤或誤解的東西請測試。)

詩篇。如果您正在讀取輸入流中的字節,則也可以將其封裝在DataInputStream中,並使用其readInt()方法。當然,也可以使用ByteArrayInputStream來讀取字節數組的輸入,獲得與上述ByteBuffer示例相同的結果。

+0

我打算從密碼字段獲取數據並在'unpack('N *,...)中使用'創建的數組將用於生成哈希碼。 '$ b = str_pad($ b,4 * ceil(strlen($ b)/ 4),「\ 0」); return array_values(unpack('N *',$ b));' 什麼是最好的? – 2013-03-20 18:18:09

+1

您首先需要使用'String.getBytes()'(使用合適的編碼,例如UTF-8)將字符串轉換爲字節數組,然後將字節數組填充爲4個字節的倍數,然後使用上面的'ByteBuffer' 。只有在查看過上面鏈接的PHP代碼後,我懷疑你實際上並不需要執行最後一個步驟,而是直接使用字節數組可能更容易。 – 2013-03-20 18:29:53

相關問題