将base64编码的字节数组转换回ASCII

时间:2018-03-16 14:04:16

标签: javascript java json base64

我正在开发一个Web应用程序,它显示由Java rest端点发送的json格式中包含的问题。问题有一个文本元素,但也可以包含二进制形式的附件(例如图片或电影)(见截图1)。在服务器上,数据以XML定义,用于使用工具xjc生成Java类。

enter image description here

现在应用程序的一般部分(即显示问题)可以工作但是我很难用数据URL技术显示图片,因为base64二进制文件存储为一个字节数组。因此,当我将value属性提供给img标记时,我得到了有符号的整数而不是ASCII字符:

(`<img src="data:image/jpeg;base64,-119,80,78,71,13`<img)

如果我在Java端点上打开调试透视图并检查问题的变量(参见screenshot2),这是可见的。

enter image description here

现在,我最初的想法是将值的数据类型从byte []更改为String,但由于我只是扩展了base64类型的XML,我怀疑这是明智之举。

我很感激你对此的看法

内容的xsd文件,它是“附件”的元素

<xs:element name="content">
<xs:complexType>
    <xs:simpleContent>
        <xs:extension base="xs:base64Binary">
            <xs:attribute name="filename" type="xs:string" use="required"/>
            <xs:attribute ref="xml:lang"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>

问题的示例定义

<question id="q1" type="yesno">
    <text>Is the organizations...?</text>
    <attachments>
        <attachment id="q1a1pic" mime="image/jpeg">
            <content filename="image.jpg" xml:lang="de>iVB....cut....
            </content>
        </attachments>
    </attachments>
</question>

生成的类内容:

public class Content {

@XmlValue
protected byte[] value;

1 个答案:

答案 0 :(得分:0)

结果是缺少一个拼图,这是一个自定义XML适配器。您可以扩展javax.xml.bind.annotation.adapters XMLAdapter类,并实现marshal()和unmarshal()来执行转换。

public class Base64Adapter extends XmlAdapter<byte[], String> {

  @Override
  public String unmarshal(byte[] v) throws Exception {
    return Base64.getEncoder().encodeToString(v);
  }

  @Override
  public byte[] marshal(String v) throws Exception {
    return Base64.getDecoder().decode(v);
  }
}

然后,使用xjc重新编译类,包括在bindings参数中的新适配器:"xjc.exe" -d "app\platform\src\main\java" -b src/main/resources/XMLBinding.xjc -p example.company.com src\main\resources\model.xsd

有关更多详细信息,请参见API

相关问题