Java 将字节数组转换为字符串

Java 将字节数组转换为字符串,java,arrays,string,byte,Java,Arrays,String,Byte,我正在尝试将字节数组转换为字符串,并使用PrintWriter将其写入文件(仅用于使用mc检查其值,我需要字符串中的内容) 我的问题总结如下: //-77 is "equivalent" to 179 or 0xb3 (i also tried those using ByteArrayOutputStream, where these are valid values) byte[] b = new byte[]{0,0,1,-77}; //I save the String to a tx

我正在尝试将字节数组转换为
字符串
,并使用
PrintWriter
将其写入文件(仅用于使用mc检查其值,我需要字符串中的内容) 我的问题总结如下:

//-77 is "equivalent" to 179 or 0xb3 (i also tried those using ByteArrayOutputStream, where these are valid values)
byte[] b = new byte[]{0,0,1,-77};

//I save the String to a txt, so i can check its value with midnight commander
try(  PrintWriter out = new PrintWriter("~/Desktop/output.txt")){
    out.println( new String(b) );
}
output.txt的内容为十六进制和mc: 00 01 EF | BF BD 0A
尽管它应该是:00 01 B3

这是什么原因?我想这是编码,但我不知道应该使用哪种类型的编码(我尝试了一些Cp类型,但到目前为止没有一种有效)

更新:
将每个负字节转换为如下字符串的结果是:EF BF BD
因此,它仅在无符号字节值小于128时有效。
所以问题是,如何在字符串中表示大于127的字节,就像用0-127字节表示一样?

这样就可以了。它将按预期输出
00 01 b3

FileOutputStream fos = new FileOutputStream("filename");
fos.write(b);
fos.close();

这样就行了。它将按预期输出
00 01 b3

FileOutputStream fos = new FileOutputStream("filename");
fos.write(b);
fos.close();

您可能应该对字节进行编码,而不是像使用字符串一样使用它们。只有当字节数组是字符串的有效编码时,才应使用
新字符串(byte[])
。HTTP可以处理字节。可能字节数组已签名。尝试使用未签名的字节[]。您的四个输入字节采用哪种编码?如果您不能回答这个问题,那么字符串就不是适合您使用的数据类型Java没有无符号字节。我不能仅仅发布一个字节数组,它需要一个字符串。上面显示的代码是一个示例,但我需要发送精确的给定字节(作为字符串),因此无法对其进行编码。我已经使用这种类型的转换大约两个星期了,大部分时间都可以正常工作。这个0xb3是导致问题的唯一值(到目前为止)。您可能应该对字节进行编码,而不是试图将它们当作字符串来使用。只有当字节数组是字符串的有效编码时,才应使用
新字符串(byte[])
。HTTP可以处理字节。可能字节数组已签名。尝试使用未签名的字节[]。您的四个输入字节采用哪种编码?如果您不能回答这个问题,那么字符串就不是适合您使用的数据类型Java没有无符号字节。我不能仅仅发布一个字节数组,它需要一个字符串。上面显示的代码是一个示例,但我需要发送精确的给定字节(作为字符串),因此无法对其进行编码。我已经使用这种类型的转换大约两个星期了,大部分时间都可以正常工作。这个0xb3是导致问题的唯一值(到目前为止)。感谢您的快速回答,它确实起到了作用。但将其写入txt只是出于测试目的,我需要将其值作为字符串。字符串是否有类似于FileOutputStream的内容?或者我应该读回txt-s的内容吗?(这似乎不太理想)@leviathan11这是一个全新的问题。没有人会将其视为对不同问题答案的评论。这正是我最初的问题,但由于这是我在stackoverflow上的第一篇帖子,我无法真正撰写它,因此它被编辑错了主题。谢谢你的快速回答,它真的做到了。但将其写入txt只是出于测试目的,我需要将其值作为字符串。字符串是否有类似于FileOutputStream的内容?或者我应该读回txt-s的内容吗?(这似乎不太理想)@leviathan11这是一个全新的问题。没有人会将它视为对不同问题答案的评论。这正是我最初的问题,但由于这是我在stackoverflow上的第一篇文章,我无法真正撰写它,因此它被编辑错了主题。