所以我有一个二进制数据字符串,如下所示:
String lob = "ÿØÿà...";
我真的无法控制这个,所以我必须照原样。所以我需要将其转换为InputStream而不更改它,如果我这样做:
getBytes()
它将使用默认编码,如何在不进行任何编码或修改的情况下执行此操作?
编辑:
我无法从源头解决这个问题。我知道原始数据是从HTML GET加载的图像,但我不知道它在传输过程中是如何编码的。我现在所拥有的只是一个非常长的字符串,我需要将其转换回来并将其保存到数据库中。
答案 0 :(得分:11)
没有像没有编码那样的转换这样的概念。您在字符和字节之间进行转换 - 这些不是一回事,因此需要转换,转换的形式正是编码。声称在不使用编码的情况下进行转换的任何内容只是假设某些特定的编码而不必知道它们正在这样做。
如果要获取原始二进制数据,则需要找出用于将字节转换为字符串的编码。您可能发现ISO-8859-1可以正常工作,但您确实需要检查。
同时,您应该尝试非常将其更改为使用类似base64的内容。将任意二进制数据转换为文本并返回就像这样会导致灾难。
答案 1 :(得分:1)
如果确实你的String包含错误地放入字符串而不是字节数组的二进制数据,那么有一种简单的转换方法:
byte[] target = new byte[lob.length()];
for(int i = 0; i < lob.length(); i++)
target[i] = (byte)lob.charAt(i);
然而,如果这些数据是某种文本的话,那么Jon Skeet的回答是正确的。
(顺便说一句,这与ISO-8859-1编码相同。)
答案 2 :(得分:0)
字符串使用UTF-16编码并避免转换,您可以使用此编码,并且每个16位字符都是按原样发送的。
假设您处于Little-Endian环境
out.write(lob.getBytes(StandardCharset.UTF_16LE));
无需进一步编码即可发送所有有效字符。
注意:二进制数据不应存储在字符串中,除非您确实知道这样做是安全的,因为并非所有16位值都是有效字符。存储二进制数据的更好方法是使用字节。
答案 3 :(得分:0)
我同意Jon Skeet的100%同意。我将补充说,Java会将任何String数据隐式转换为UTF-16,但是隐式转换是在显式转换之上进行的,这是由传递给您数据的人(无论他们是否知道)完成的,所以使用getBytes(“UTF-16”)也不会自动运行,除非他们另有说明或您自己检查过。
了解数据的来源以及数据的编码方式是将其正确转换回来的唯一方法。