Hex Forme codée de tableau d'octets différentes de même tableau d'octets «objet» converti en tableau d'octets. Pourquoi?

StackOverflow https://stackoverflow.com/questions/5485836

Question

Cette question est posée par curiosité plutôt qu'au besoin urgent. J'ai trouvé du code pour convertir un objet en un tableau d'octets (je pensais que j'en avais besoin à l'époque).

En utilisant Commons-Codec, j'ai remarqué que la représentation de chaîne hexagonale codée du tableau d'octets pur était différente de ce que j'avais si je passais le tableau d'octets via la méthode "TobyTearray" ci-dessous. J'ai remarqué que la version plus longue se termine par la version plus courte de la représentation de la chaîne hexagonale.

Instinctivement, cela ne semble pas bien, pourquoi cela se produit-il?

Que représentent les octets supplémentaires via la méthode de conversion "TobyTearray"?

Je suppose que c'est quelque chose à voir avec le codage?

Merci beaucoup, j'espère que ce n'est pas trop une question débutante.

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import org.apache.commons.codec.binary.Hex;

public class Test {

    public static void main(String[] args) throws IOException {
        byte[] bytes = "Stackoverflow".getBytes();
        System.out.println(Hex.encodeHexString(bytes));
        System.out.println(Hex.encodeHexString(toByteArray(bytes)));
    }

    public static byte[] toByteArray(Object obj) throws IOException {
        byte[] bytes = null;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(obj);
        oos.flush();
        oos.close();
        bos.close();
        bytes = bos.toByteArray();
        return bytes;
    }
}

RÉSULTAT

537461636B6F766572666C6F77 ACED0005757200025B42ACF317F8060854E0020000787000000D537461636B6F766572666C6F77

Était-ce utile?

La solution

Le deuxième codage est beaucoup plus long car il s'agit d'un format de sérialisation d'objet tandis que le premier cas n'est que le contenu. La sérialisation de l'objet a l'en-tête, le type de l'objet et enfin le contenu de l'objet (vous remarquerez que la fin est la même)

Autres conseils

Un objectOutStream est capable de sérialiser tout type d'objet (tant qu'il est sérialisable). Donc, ça ne peut pas vraiment cartographier byte[] Pour lui-même, car cela impliquerait qu'il n'y a pas de place pour d'autres objets.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top