如果我使用ISO-8859-1编码将二进制流读入字符串,并随后将其转换回二进制流,我会得到完全相同的字节吗?如果没有,我什么时候不会得到相同的字节呢?
public byte[] toStringAndBack(byte[] binaryData) throws Exception {
String s = new String(binaryData, "ISO-8859-1");
return s.getBytes("ISO-8859-1");
}===编辑===
测试:
byte[] d = {0, 1, 2, 3, 4, (byte)128, (byte)129, (byte)130}; // some not defined values
byte[] dd = toStringAndBack(d);
for (byte b : dd)
System.out.print((b&0xFF) + " ");输出:
0 1 2 3 4 128 129 130因此,即使没有定义的字节似乎被正确地转换。
发布于 2016-01-14 10:12:11
构造函数说:
当给定字节在给定字符集中无效时,此构造函数的行为未指定。
因此从理论上讲,它可能会失败,因为ISO-8859-1没有为任何值赋值,比如0-31和128-160。
这意味着,即使它在给定的JVM的String实现(或ISO-8859-1的Charset实现)上工作,您也不能依赖它来处理另一个JVM的String/Charset实现(不管它是来自同一个厂商的JVM的一个不同的点-rev,还是不同厂商的JVM)。
发布于 2016-01-14 10:03:36
让我们来测试一下:
// all possible bytes
byte[] bin = new byte[256];
for (int i=0; i<bin.length; i++)
bin[i] = (byte)i;
// convert to string
String s = new String(bin, "ISO-8859-1");
for (int i=0; i<s.length(); i++)
{
if (s.charAt(i) != i)
System.out.println(i + " s[i]=" + s.charAt(i));
}
// convert back to byte[]
byte[] bout = s.getBytes("ISO-8859-1");
for (int i=0; i<bin.length; i++)
{
if (bin[i] != bout[i])
System.out.println(i + " in=" + bin[i] + " bout=" + bout[i]);
}
System.out.println("done");它只打印done。
因此,至少对于当前的ISO-8859-1实现,如问题中所定义的那样,这些操作是二进制安全的。
编辑:
当前的实现是sun.nio.cs.ISO_8859_1。查看源时,它只检查char是否小于256,以确定是否可以编码。
https://stackoverflow.com/questions/34786221
复制相似问题