Шестнадцатеричная кодированная форма байтового массива, отличающаяся от того же байтового массива "объект", преобразованного в байтовый массив. Зачем?

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

Используя 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 = "Stackru".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 ответа

Решение

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

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

Другие вопросы по тегам