Шестнадцатеричная кодированная форма байтового массива, отличающаяся от того же байтового массива «объект», преобразованного в байтовый массивЗачем? - PullRequest
3 голосов
/ 30 марта 2011

Этот вопрос задается из любопытства, а не срочно. Я нашел некоторый код для преобразования объекта в байтовый массив (я думал, что он мне нужен в то время).

Используя commons-codec, я заметил, что закодированное шестнадцатеричное представление чистого байтового массива отличается от того, что я получил, если передал байтовый массив через метод "toByteArray" ниже. Я заметил, что более длинная версия заканчивается более короткой версией шестнадцатеричного строкового представления.

Инстинктивно это не кажется правильным, почему это происходит?

Что представляют собой дополнительные байты, найденные с помощью метода преобразования "toByteArray"?

Полагаю, это как-то связано с кодировкой?

Большое спасибо, я надеюсь, что это не слишком большой вопрос для новичка.

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

РЕЗУЛЬТАТ

537461636b6f766572666c6f77 aced0005757200025b42acf317f8060854e002000078700000000d537461636b6f766572666c6f77

Ответы [ 2 ]

7 голосов
/ 30 марта 2011

Вторая кодировка намного длиннее, потому что это формат сериализации объекта, тогда как первый случай - это просто содержимое. Сериализация объекта имеет заголовок, тип объекта и, наконец, содержимое объекта (вы заметите, что конец такой же)

2 голосов
/ 30 марта 2011

ObjectOutputStream способен сериализовать любой тип объекта (при условии, что он сериализуем). Таким образом, он не может на самом деле сопоставить любые byte[] с самим собой, поскольку это будет означать, что нет места для других объектов.

...