将二进制数据附加到序列化的xml标头

时间:2013-05-14 10:40:16

标签: serialization encoding binary jaxb

我需要将二进制数据附加到文件,但在此数据之前是xml标头。整个文件不是正确的xml文件,但它必须是正确的xml标头,如下所示:

<EncryptedFileHeader>
    <Algorithm>name</Algorithm>
    <KeySize>256</KeySize>
    <SubblockLength>64</SubblockLength>
    <CipherMode>ECB</CipherMode>
    <sessionKey>sessionKey</sessionKey>  
</EncryptedFileHeader>
*binary data*

我使用JAXB编组的xml标头很容易,更容易在base64中添加这个二进制数据并存储在xml中的note中。但这是一个线索。我必须将其存储为二进制文件,以节省base64使用的33%空间。

所以问题是如何添加这些数据,当然后来读回来(序列化/反序列化)?

另一个问题是如何从第一行文档中删除?

我试图使用:

marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE);

但它引发了一个例外:

javax.xml.bind.PropertyException:name:com.sun.xml.bind.xmlDeclaration value:false     在javax.xml.bind.helpers.AbstractMarshallerImpl.setProperty(AbstractMarshallerImpl.java:358)     at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.setProperty(MarshallerImpl.java:527)

由于

1 个答案:

答案 0 :(得分:0)

Actualy我通过使用JAXB序列化xml头,然后将二进制数据(bytearray)附加到现有文件来解决这个问题。 使用缓冲读卡器从文件中读取如下:

BufferedReader reader = new BufferedReader(new FileReader("filepath"));
        String line, results = "";
        while ((line = reader.readLine()) != null) {
            results += line;
        }
        reader.close();

        String[] splited = results.split("</EncryptedFileHeader>");
        splited[0] += "</EncryptedFileHeader>";
        String s0 = splited[0];
        String s1 = new String(splited[1]);
        ByteArrayInputStream bais = new ByteArrayInputStream(s0.getBytes());

现在我遇到第二个拆分字符串s1的问题,它包含来自“byteArrayOutputStream.toByteArray();”的数据。现在我必须将数据从此字符串传输到字节数组。来自:

' A g X

类似于:
[39,-63,-116,65,-123,-114,27,-115,-2,103,-64,88,-99,-96,-26,-12]

我试过(在同一台机器上): byte [] bytes = s1.getBytes();

但是bytes数组是不同的并且返回34个字节而不是16.我读了很多关于编码但仍然不知道。

编辑:

不同字节数的问题是由于逐行字符和字节流的不同表示。