java - Java String 和 byte[] 转换疯狂
问题描述
如何使用正确的格式/编码byte[]
从 a中提取 a?String
这就是我所拥有的:
byte[] bytes = // some byte[] derived from custom code
String bytesString = // some string derived from the bytes above with custom code
byte[] newBytes = // TODO: transform bytesString back into bytes above
System.out.println(Arrays.toString(bytes));
// [74, -61, 58, 97, 127, -8, -5, -123, 70, 51, 65, 109, -20, -43, 117, 83]
System.out.println(bytesString);
// JÃ:aøû…F3AmìÕuS
System.out.println(Arrays.toString(bytesString.getBytes())); // similar but not identical
// [74, -61, -125, 58, 97, 127, -61, -72, -61, -69, -62, -123, 70, 51, 65, 109, -61, -84, -61, -107, 117, 83]
我正在尝试将bytesString
上述内容转换回确切的byte[]
. 这是我最接近的:
byte[] newBytes = bytesString.getBytes("UTF-16LE");
System.out.println(newBytes); // identical if we remove the 0s
// [74, 0, -61, 0, 58, 0, 97, 0, 127, 0, -8, 0, -5, 0, -123, 0, 70, 0, 51, 0, 65, 0, 109, 0, -20, 0, -43, 0, 117, 0, 83, 0]
当然,我不想只是从上面的数组中删除 0。我错过了什么?
解决方案
在处理字节数组和字符串时正确使用字符集的快速演示:
byte[] arr = {74, -61, 58, 97, 127, -8, -5, -123, 70, 51, 65, 109, -20, -43, 117, 83};
String bytesString = new String(arr, "ISO-8859-1"); // or "UTF-16LE"
byte[] bbb = bytesString.getBytes("ISO-8859-1"); // or "UTF-16LE"
System.out.println("string : '" + bytesString + "'");
System.out.println("input array: " + Arrays.toString(arr));
System.out.println("bytesString: " + Arrays.toString(bbb));
打印相等的字节数组:
string : '썊愺藻㍆流헬卵'
input array: [74, -61, 58, 97, 127, -8, -5, -123, 70, 51, 65, 109, -20, -43, 117, 83]
bytesString: [74, -61, 58, 97, 127, -8, -5, -123, 70, 51, 65, 109, -20, -43, 117, 83]
"UTF-16LE"
如果在创建字符串和从中获取字节时都提供了字符集,则会打印相同的结果。
推荐阅读
- google-cloud-platform - 成功后可以在 Google Cloud Dataflow 中重新运行作业
- plotly-python - 用情节分割y轴?
- node.js - 在 VPS 上安装依赖项时的 SQLite 问题
- python - 在 Python Flask 中获取身份验证日志记录(成功和失败)
- javascript - 通过 chrome 扩展模拟原始鼠标输入
- nfc - 通讯 NDEF
- angular - 角度延迟加载...减慢页面速度?
- tfs - 升级到 TFS 2017.3 后,门户网站签入不会启动封闭签入构建
- kotlin - 在 kotlin 中使用 lambdas 进行分页
- reactjs - 与手风琴部分外部的相关图像反应手风琴