java - 扩展ascii的base64编码
问题描述
我正在从 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 图表(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 [main] 错误 com.trackener.backend.api.device.service.DeviceService - 消息处理失败 java.lang.IllegalArgumentException:最后一个单元在 java.util.Base64$Decoder.decode0 处没有足够的有效位(Base64.java:734) 在 java.util.Base64$Decoder.decode(Base64.java:526)
如何使用扩展 ascii 中的特殊字符将字节转换为这个小的 base64 字符串? 如果我可以用另一种方法来做到这一点(从字节数组中获取一个包含尽可能少字符的唯一代码),我也会很高兴。
解决方案
您混淆了编码和解码。如果您有想要“安全”形式的二进制数据(8 位字节),您希望将它们编码为 base64。并且一旦它们被编码,您就不需要将它们转换为十六进制来显示它们;编码的重点是结果是可打印的 ASCII。
public static String getBase64HexDeviceIdFromSerialBytes(byte[] serial) {
return java.util.Base64.getEncoder().encodeToString(ArrayUtils.subarray(serial, 0, 12));
}
推荐阅读
- javascript - 页面上可拖动的 React 导致 React 输入焦点丢失
- html - 如何自动将 HTML 从现有网站复制到我的新网站?
- c# - 寻找司机性别百分比。为什么我的输出一直给我0%......我的错误在哪里?
- r - 2^I 中的错误:二进制运算符的非数字参数 - Rcapture 包
- github - github 使用 API 识别 PAT 令牌 ID?
- pytorch - 给定前馈步骤中张量的索引版本,pytorch 如何执行反向微分?
- reactjs - 将 CSV 数据添加到 React 应用程序,而文件不会在构建中结束
- r - 如何使用 R 中的 copula 函数计算条件概率?
- java - 损坏的表值,我该如何解决?
- javascript - 如何访问嵌入式对象?