我有一个通过网络连接读取的字节数组,我需要将其转换为没有任何编码的字符串,也就是说,只需将每个字节视为字符的低端并保留高端零。我还需要做反应,我知道角色的高端始终为零。
搜索网络会产生几个类似的问题,这些问题都得到了回复,表明必须更改原始数据源。这不是一个选项,所以请不要提出建议。
这在C中是微不足道的,但Java似乎要求我编写一个我自己的转换例程,这可能是非常低效的。有一种我错过的简单方法吗?
答案 0 :(得分:1)
这会将字节数组转换为字符串,而只填充高8位。
public static String stringFromBytes(byte byteData[]) {
char charData[] = new char[byteData.length];
for(int i = 0; i < charData.length; i++) {
charData[i] = (char) (((int) byteData[i]) & 0xFF);
}
return new String(charData);
}
效率应该非常好。就像Ben Thurley所说,如果性能真的是这样的问题,那么首先不要转换为String,而是使用字节数组。
答案 1 :(得分:1)
不,你不会错过任何东西。没有简单的方法可以做到这一点,因为String
和char
用于文本。您显然不希望将数据作为文本处理 - 如果文本不是文本则完全有意义。你可以用你提出的艰难方式去做。
另一种方法是假设一个字符编码,允许任意字节值的任意序列(0-255)。 ISO-8859-1或IBM437都符合资格。 (Windows-1252只有251个码点.UTF-8不允许任意序列。)如果你使用ISO-8859-1,结果字符串将与你的硬盘相同。
至于效率,处理字节数组的最有效方法是将其保存为字节数组。
答案 2 :(得分:0)
使用弃用的构造函数String(byte[] ascii, int hibyte)
String string = new String(byteArray, 0);
答案 3 :(得分:-1)
以下示例代码可将try {
runTask();
}
catch (InterruptedException e) {
// Log etc.
}
finally {
finalizeTask();
}
转换为String
并返回byte array
而无需编码。
String
答案 4 :(得分:-1)
字符串已编码为Unicode / UTF-16。 UTF-16意味着最多可以使用2个字符串“字符”(char
)来制作一个可显示的字符。你真正想要的是:
byte[] bytes = System.Text.Encoding.Unicode.GetBytes(myString);
将String转换为字节数组。这完全符合您的要求,但性能提高了10倍。如果您想将传输数据减少近一半,我建议将其转换为UTF8(ASCII是UTF8的子集) - 互联网使用90%的时间格式,通过调用:
byte[] bytes = Encoding.UTF8.GetBytes(myString);
要转换回字符串,请使用:
String myString = Encoding.Unicode.GetString(bytes);
或
String myString = Encoding.UTF8.GetString(bytes);