无需编码即可将字符串转换为字节数组

时间:2016-06-22 09:28:46

标签: java string data-conversion

我有一个通过网络连接读取的字节数组,我需要将其转换为没有任何编码的字符串,也就是说,只需将每个字节视为字符的低端并保留高端零。我还需要做反应,我知道角色的高端始终为零。

搜索网络会产生几个类似的问题,这些问题都得到了回复,表明必须更改原始数据源。这不是一个选项,所以请不要提出建议。

这在C中是微不足道的,但Java似乎要求我编写一个我自己的转换例程,这可能是非常低效的。有一种我错过的简单方法吗?

5 个答案:

答案 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)

不,你不会错过任何东西。没有简单的方法可以做到这一点,因为Stringchar用于文本。您显然不希望将数据作为文本处理 - 如果文本不是文本则完全有意义。你可以用你提出的艰难方式去做。

另一种方法是假设一个字符编码,允许任意字节值的任意序列(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);