扩展ascii

时间:2018-06-01 18:47:16

标签: java base64 byte extended-ascii bytestream

我从物联网设备接收二进制文件。我试图将一个由最多13个字节的列表组成的标识符转换为可能的最小可读字符串。

为此,我将其解码为Base64,然后将字节转换为十六进制,以便

byte[] bytes = {0x24, 0x54, 0x4b, 0x00, 0x31, 0x00, 0x0e, 0x50, 0x33, 0x42, 0x58, 0x35};

成为

4CAD4FDC15F9

Base64 decoding of normal ascii bytes

但是,当我在扩展的ascii中接收字节时(在调试器中,字节显示为负值),转换为base64会返回一个空的字节数组。

Base64 decoding of extended ascii bytes

我一直在使用org.apache.tomcat.util.codec.binary.Base64,它在文档中提到它没有考虑文档中提到的扩展ASCII字符:

  

由于此类直接在字节流上运行,而不是字符流,因此仅对其进行硬编码    *编码/解码与低127 ASCII图表兼容的字符编码(ISO-8859-1,Windows-1252,    * UTF-8等。

我也尝试过java.util.Base64,它使用第一个字节数组,并使用第二个字节数组抛出异常

public static String getBase64HexDeviceIdFromSerialBytes(byte[] serial) {
    byte[] base64Bytes = java.util.Base64.getMimeDecoder().decode(ArrayUtils.subarray(serial, 0, 12));
    String hex = BytesUtils.bytesToHex(base64Bytes);
    return hex;
}
  

19:39:31.946 [主要]错误   com.trackener.backend.api.device.service.DeviceService - 消息   处理失败java.lang.IllegalArgumentException:最后一个单元   没有足够的有效位   java.util.Base64 $ Decoder.decode0(Base64.java:734)at   java.util.Base64 $ Decoder.decode(Base64.java:526)

如何设法从字节转换为这个带有扩展ascii中特殊字符的小base64字符串? 如果我可以用另一种方法做到这一点(为了从字节数组中获得尽可能少的字符的唯一代码),我也很高兴。

1 个答案:

答案 0 :(得分:3)

你混淆了编码和解码。如果你想要“安全”形式的二进制数据(8位字节),你想编码它们作为base64。一旦它们被编码,您就不需要将它们转换为十六进制来显示它们;编码点是结果是可打印的ASCII。

public static String getBase64HexDeviceIdFromSerialBytes(byte[] serial) {
    return java.util.Base64.getEncoder().encodeToString(ArrayUtils.subarray(serial, 0, 12));
}