Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否在不编码的情况下将字符串转换为字节数组?_Java - Fatal编程技术网

Java 是否在不编码的情况下将字符串转换为字节数组?

Java 是否在不编码的情况下将字符串转换为字节数组?,java,Java,所以我有一个包含二进制数据的字符串,如下所示: String lob = "ÿØÿà..."; 我真的无法控制这一切,所以我不得不接受它。因此,我需要将其转换为InputStream而不进行更改,如果我只是这样做: getBytes() 它将使用默认编码,如何在不进行任何编码或修改的情况下执行此操作 编辑: 我无法从源头上解决这个问题。我知道原始数据是从HTMLGET加载的图像,但我不知道它在传输过程中是如何编码的。我现在只有一个很长的字符串,我需要把它转换回来并保存到数据库中 没有像这样的

所以我有一个包含二进制数据的字符串,如下所示:

String lob = "ÿØÿà...";
我真的无法控制这一切,所以我不得不接受它。因此,我需要将其转换为InputStream而不进行更改,如果我只是这样做:

getBytes()
它将使用默认编码,如何在不进行任何编码或修改的情况下执行此操作

编辑:


我无法从源头上解决这个问题。我知道原始数据是从HTMLGET加载的图像,但我不知道它在传输过程中是如何编码的。我现在只有一个很长的字符串,我需要把它转换回来并保存到数据库中

没有像这样的没有编码的转换概念。您正在字符和字节之间进行转换-它们不是同一件事,因此需要进行转换,转换的形式正是编码。任何声称在不使用编码的情况下进行转换的东西都只是假设了某种特定的编码,而不一定知道他们正在这样做

如果要获取原始二进制数据,需要找出将字节转换为字符串的编码。您可能会发现ISO-8859-1可以工作,但您确实需要检查


同时,您应该尽力将其更改为使用base64之类的内容。像这样将任意二进制数据转换为文本并返回是一种灾难。

没有像这样不编码的转换概念。您正在字符和字节之间进行转换-它们不是同一件事,因此需要进行转换,转换的形式正是编码。任何声称在不使用编码的情况下进行转换的东西都只是假设了某种特定的编码,而不一定知道他们正在这样做

如果要获取原始二进制数据,需要找出将字节转换为字符串的编码。您可能会发现ISO-8859-1可以工作,但您确实需要检查


同时,您应该尽力将其更改为使用base64之类的内容。像这样将任意二进制数据转换为文本并返回是一种灾难。

如果您的字符串中包含的二进制数据确实被错误地放入字符串而不是字节数组中,那么有一种非常简单的转换方法:

byte[] target = new byte[lob.length()];
for(int i = 0; i < lob.length(); i++)
    target[i] = (byte)lob.charAt(i);
byte[]target=新字节[lob.length()];
对于(int i=0;i
然而,如果这些数据是某种文本,那么Jon Skeet的答案是正确的


(顺便说一句,这与ISO-8859-1编码相同。)

如果您的字符串包含的二进制数据被错误地放入字符串而不是字节数组中,那么有一种非常简单的转换方法:

byte[] target = new byte[lob.length()];
for(int i = 0; i < lob.length(); i++)
    target[i] = (byte)lob.charAt(i);
byte[]target=新字节[lob.length()];
对于(int i=0;i
然而,如果这些数据是某种文本,那么Jon Skeet的答案是正确的


(顺便说一句,这与ISO-8859-1编码相同。)

字符串使用UTF-16编码,为了避免转换,可以使用此编码,每个16位字符按原样基本发送

假设你在一个小小的Endian环境中

out.write(lob.getBytes(StandardCharset.UTF_16LE));
将发送所有有效字符,无需进一步编码


注意:二进制数据不应以字符串形式存储,除非您确实知道这样做是安全的,因为并非所有16位值都是有效字符。存储二进制数据的更好方法是使用字节。

字符串使用UTF-16编码,为了避免转换,可以使用这种编码,每个16位字符按原样基本发送

假设你在一个小小的Endian环境中

out.write(lob.getBytes(StandardCharset.UTF_16LE));
将发送所有有效字符,无需进一步编码


注意:二进制数据不应以字符串形式存储,除非您确实知道这样做是安全的,因为并非所有16位值都是有效字符。存储二进制数据的更好方法是使用字节。

我100%同意Jon Skeet的观点。我要补充的是,Java会将任何字符串数据隐式转换为UTF-16,但是隐式转换是在显式转换的基础上进行的,显式转换是由向您传递该数据的人完成的(无论他们是否知道),因此使用getBytes(“UTF-16”)也不会自动工作,除非他们另有说明,或者你自己检查过


知道数据的来源和编码是正确转换回数据的唯一方法。

我100%同意Jon Skeet的观点。我要补充的是,Java会将任何字符串数据隐式转换为UTF-16,但是隐式转换是在显式转换的基础上进行的,显式转换是由向您传递该数据的人完成的(无论他们是否知道),因此使用getBytes(“UTF-16”)也不会自动工作,除非他们另有说明,或者你自己检查过


知道数据的来源和编码方式是正确转换回数据的唯一方法。

你能不能设置utf-8并从那里开始?@Woot4Moo:如果OP试图反转之前某个步骤执行的编码,则不会这样做……问题是你可能已经上了圈套;尝试查看
.indexOf('\ufffd')
是否为-1;如果是,您可以将其返回到原始数据,如果不是,则返回SOL!您好@fge我运行了.indexOf('\ufffd'),它不是-1,我如何挽救这种情况?嗯,您不能。。。U+FFFD是Unicode的替换字符,当字节序列无法转换为字符时,它是编码过程使用的字符。您需要与源进行“协商”,并告诉他们解决问题,即直接发送字节……您是否可以设置utf-8并从那里开始?@Woot4Moo:如果OP试图反转之前某个步骤执行的编码,则不会这样做……问题是您可能已经完蛋了;尝试查看
.indexOf('\ufffd')
是否为-1;如果是,你可以把它转回去