2013-03-20 1 views
3

Je n'ai aucune expérience de codage en PHP du tout. Mais en cherchant une solution pour mon projet Java, j'ai trouvé un exemple du problème en PHP, qui est d'ailleurs étranger à moi.comment convertir PHP unpack() dans une méthode similaire en Java

Quelqu'un peut-il s'il vous plaît expliquer le fonctionnement et le résultat de la fonction unpack('N*',"string") de PHP et comment l'implémenter en Java?

Un exemple m'aiderait beaucoup!

Merci!

+0

Ce n'est pas une façon productive de poser des questions. Veuillez indiquer le problème que vous tentez de résoudre en premier, puis demandez s'il y a quelque chose comme un déballage qui pourrait être utilisé pour le résoudre. – Danack

+0

le problème, Monsieur, était que j'essaie de comprendre l'API MEGA. Un monsieur très utile a expliqué et mis en œuvre la même chose en PHP [link] http://julien-marchand.fr/blog/using-the-mega-api-with-php-examples. J'utilisais cette info. pour comprendre l'API et la convertir en JAVA afin de faire une application Android! S'il vous plaît aider si vous êtes maintenant clair sur le problème! : D –

+1

J'ai regardé le code auquel vous étiez lié, et je ne suis pas vraiment sûr pourquoi il a même besoin de convertir entre les tableaux d'octets (= chaînes en PHP) et les tableaux int. En fait, je soupçonne que ce n'est pas le cas, du moins pas tout le temps comme c'est le cas actuellement. Pourtant, si vous avez besoin de le faire pour une raison quelconque, voir ma réponse ci-dessous. –

Répondre

4

In PHP (et in Perl, où PHP copié à partir de), unpack("N*", ...) prend une chaîne (ce qui représente en fait une séquence d'octets) et analyse chaque segment de 4 octets de celui-ci en tant que signé gros-boutiste (» N 32 bits etwork byte order ") entier, les renvoyant dans un tableau.

Il y a plusieurs façons de faire la même chose en Java, mais d'une façon serait d'envelopper le tableau d'octets d'entrée dans un java.nio.ByteBuffer, le convertir en un IntBuffer puis lire les nombres entiers de ce qui suit:

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; 
} 

Bien sûr, si vous voulez juste itérer sur les entiers, vous n'avez pas vraiment besoin de la IntBuffer ou le tableau:

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

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

En fait, itérer sur une ByteBuffer comme celui-ci est un moyen pratique d'imiter le beh avior d'exemples encore plus compliqués de unpack() en Perl ou PHP.

(Disclaimer: Je n'ai pas testé ce code, je crois qu'il devrait fonctionner, mais il est toujours possible que je l'ai mal compris quelque chose ou mal orthographié S'il vous plaît tester avant d'utiliser...)

Ps. Si vous lisez les octets d'un flux d'entrée, vous pouvez également l'inclure dans un DataInputStream et utiliser sa méthode readInt(). Bien sûr, il est également possible d'utiliser un ByteArrayInputStream pour lire l'entrée d'un tableau d'octets, obtenant les mêmes résultats que les exemples ByteBuffer ci-dessus.

+0

J'ai l'intention de prendre les données d'un champ de mot de passe et d'utiliser cela dans 'unpack ('N *, ...)' le tableau créé sera utilisé pour générer le code de hachage. Code PHP: '$ b = str_pad ($ b, 4 * ceil (strlen ($ b)/4)," \ 0 "); return array_values ​​(unpack ('N *', $ b)); ' Quel serait le meilleur? –

+1

Vous devez d'abord convertir la chaîne en un tableau d'octets en utilisant 'String.getBytes()' (avec un codage approprié, par exemple UTF-8), remplir le tableau d'octets à un multiple de 4 octets et utiliser ByteBuffer comme ci-dessus .Seulement, après avoir regardé le code PHP que vous avez lié à ci-dessus, je soupçonne que vous n'avez réellement besoin de faire aucune des dernières étapes, et qu'il peut être plus facile de travailler directement avec des tableaux d'octets à la place. –