扩展ascii的base64编码
base64 encoding of extended ascii
我正在从 IoT 设备接收二进制文件。我正在尝试将一些由最多 13 个字节的列表组成的标识符转换为可能的最小可读字符串。
为此,我将其解码为 Base64,然后将字节转换为十六进制,以便
byte[] bytes = {0x24, 0x54, 0x4b, 0x00, 0x31, 0x00, 0x0e, 0x50, 0x33, 0x42, 0x58, 0x35};
变成
4CAD4FDC15F9
但是,当我在扩展 ascii 中接收字节时(在调试器中,字节显示为负值),转换为 base64 returns 一个空字节数组。
我一直在使用 org.apache.tomcat.util.codec.binary.Base64,它在其文档中确实提到它没有考虑文档中提到的扩展 ASCII 字符:
Since this class operates directly on byte streams, and not character streams, it is hard-coded to only
* encode/decode character encodings which are compatible with the lower 127 ASCII chart (ISO-8859-1, Windows-1252,
* UTF-8, etc).
我也试过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 [main] ERROR
com.trackener.backend.api.device.service.DeviceService - message
processing failed java.lang.IllegalArgumentException: Last unit does
not have enough valid bits at
java.util.Base64$Decoder.decode0(Base64.java:734) at
java.util.Base64$Decoder.decode(Base64.java:526)
如何设法完成从字节到带有扩展 ascii 中的那些特殊字符的小 base64 字符串的转换?
如果我能用另一种方法做到这一点(从字节数组中获得一个字符尽可能少的唯一代码),我也会很高兴。
您混淆了编码和解码。如果您有想要 "safe" 形式的二进制数据(8 位字节),您希望将它们 编码 为 base64。一旦它们被编码,您不需要将它们转换为十六进制来显示它们;编码的重点是结果是可打印的 ASCII。
public static String getBase64HexDeviceIdFromSerialBytes(byte[] serial) {
return java.util.Base64.getEncoder().encodeToString(ArrayUtils.subarray(serial, 0, 12));
}
我正在从 IoT 设备接收二进制文件。我正在尝试将一些由最多 13 个字节的列表组成的标识符转换为可能的最小可读字符串。
为此,我将其解码为 Base64,然后将字节转换为十六进制,以便
byte[] bytes = {0x24, 0x54, 0x4b, 0x00, 0x31, 0x00, 0x0e, 0x50, 0x33, 0x42, 0x58, 0x35};
变成
4CAD4FDC15F9
但是,当我在扩展 ascii 中接收字节时(在调试器中,字节显示为负值),转换为 base64 returns 一个空字节数组。
我一直在使用 org.apache.tomcat.util.codec.binary.Base64,它在其文档中确实提到它没有考虑文档中提到的扩展 ASCII 字符:
Since this class operates directly on byte streams, and not character streams, it is hard-coded to only * encode/decode character encodings which are compatible with the lower 127 ASCII chart (ISO-8859-1, Windows-1252, * UTF-8, etc).
我也试过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 [main] ERROR com.trackener.backend.api.device.service.DeviceService - message processing failed java.lang.IllegalArgumentException: Last unit does not have enough valid bits at java.util.Base64$Decoder.decode0(Base64.java:734) at java.util.Base64$Decoder.decode(Base64.java:526)
如何设法完成从字节到带有扩展 ascii 中的那些特殊字符的小 base64 字符串的转换? 如果我能用另一种方法做到这一点(从字节数组中获得一个字符尽可能少的唯一代码),我也会很高兴。
您混淆了编码和解码。如果您有想要 "safe" 形式的二进制数据(8 位字节),您希望将它们 编码 为 base64。一旦它们被编码,您不需要将它们转换为十六进制来显示它们;编码的重点是结果是可打印的 ASCII。
public static String getBase64HexDeviceIdFromSerialBytes(byte[] serial) {
return java.util.Base64.getEncoder().encodeToString(ArrayUtils.subarray(serial, 0, 12));
}