我正在从IoT设备接收二进制文件。我正在尝试将由最多13个字节的列表组成的一些标识符转换为尽可能小的可读字符串。
为此,我将其解码为Base64,然后将字节转换为十六进制,以便
`byte[] bytes = {0x24, 0x54, 0x4b, 0x00, 0x31, 0x00, 0x0e, 0x50, 0x33, 0x42, 0x58, 0x35};`
变成了
4CAD4FDC15F9
但是,当我在扩展ascii中接收字节(在调试器中,字节显示为负值)时,转换为base64将返回一个空字节数组。
我一直在使用org.apache.tomcat.util.codec.binary.Base64,它在文档中提到它没有考虑文档中提到的扩展ASCII码:
因为这个类直接操作字节流,而不是字符流,所以它被硬编码为*编码/解码字符编码,这些字符编码与较低的127个ASCII图表(-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;
}
main ERROR com.trackener.backend.api.device.service.DeviceService 19:39:31.946 main ERROR java.util.Base64$Decoder.decode0(Base64.java:734) - message processing failed java.lang.IllegalArgumentException: Last unit at java.util.Base64$Decoder.decode(Base64.java:526)没有足够的有效位
如何使用扩展ascii中的特殊字符实现从字节到这个小base64字符串的转换?如果我可以用另一种方法(从字节数组中获得一个字符尽可能少的唯一代码),我也会很高兴。
发布于 2018-06-02 03:19:28
你混淆了编码和解码。如果您有想要以“安全”形式存在的二进制数据(8位字节),则需要将它们编码为base64。
public static String getBase64HexDeviceIdFromSerialBytes(byte[] serial) {
return java.util.Base64.getEncoder().encodeToString(ArrayUtils.subarray(serial, 0, 12));
}
https://stackoverflow.com/questions/50649419
复制相似问题