当前位置: 首页 > 面试题库 >

字节数组到字符串并返回..问题与-127

毕魁
2023-03-14
问题内容

在下面的:

 scala> (new String(Array[Byte](1, 2, 3, -1, -2, -127))).getBytes
 res12: Array[Byte] = Array(1, 2, 3, -1, -2, 63)

为什么将-127转换为63?以及如何将其恢复为-127

[编辑:]下面的Java版本(表明它不仅是“ Scala问题”)

c:\tmp>type Main.java
public class Main {
    public static void main(String [] args) {
        byte [] b = {1, 2, 3, -1, -2, -127};
        byte [] c = new String(b).getBytes();
        for (int i = 0; i < 6; i++){
            System.out.println("b:"+b[i]+"; c:"+c[i]);
        }
    }
}
c:\tmp>javac Main.java
c:\tmp>java Main
b:1; c:1
b:2; c:2
b:3; c:3
b:-1; c:-1
b:-2; c:-2
b:-127; c:63

问题答案:

您正在调用的构造函数使得二进制到字符串的转换使用解码:变得很明显String(byte[] bytes, Charset charset)。您想要的是根本不使用解码。

幸运的是,有一个构造函数:String(char[] value)

现在,您将数据存储在一个字符串中,但是您希望完全照原样返回它。但猜猜怎么了! getBytes(Charset charset)
没错,还会自动应用一种编码。幸运的是,有一种 toCharArray()方法。

如果必须以字节开头并以字节结尾,则必须将char数组映射到字节:

(new String(Array[Byte](1,2,3,-1,-2,-127).map(_.toChar))).toCharArray.map(_.toByte)

因此,总结一下:在之间转换StringArray[Byte]涉及编码和解码。如果要将二进制数据放入字符串中,则必须在字符级别进行。但是请注意,这将为您提供一个垃圾字符串(即结果不会像String预期的那样形成格式正确的UTF-16
),因此,您最好将其读取为字符并将其转换回字节。

可以
通过增加512来向上移动字节;那么您将获得一堆有效的单个Char代码点。但这使用16位来表示每8位,即50%的编码效率。对于串行化二进制数据,Base64是更好的选择(8位代表6,效率为75%)。



 类似资料:
  • 问题内容: 我看到许多人都遇到过类似的问题,但是我还没有尝试确切地找到我想要的东西。 因此,我有一个读取输入图像并将其转换为字节数组的方法: 我现在要做的是将其转换回BufferedImage(我有一个需要此功能的应用程序)。请注意,“ test”是字节数组。 但是,这将返回以下异常: 这是因为BufferedImage img为空。我认为这与以下事实有关:在我从BufferedImage到字节数

  • 问题内容: 我试图理解一个到字符串,一个的字符串表示形式到转换…我将我的转换成一个要发送的字符串,然后我希望我的Web服务(用python编写)将数据直接回显给客户端。 当我从Java应用程序发送数据时… 字节发送.. 发送(这是Arrays.toString()的结果,它应该是我的字节数据的字符串表示形式,该数据将通过电线发送): 在python端,python服务器将字符串返回给调用方(我可以

  • 问题内容: 首先,对英语不好对不起。 好吧,我想从torrent文件中读取散列信息。目前,我正在使用https://github.com/hyPiRion/java- bencode 这个bencode库来解码信息,但是我的问题是当我想将字符串转换为字节数组时。种子文件使用UTF-8编码。但是如果我这样做 很好。任何真正有用的东西。 另一方面,为了比较或尝试获取字符串,而不是获取字节,我已经阅读了

  • 问题内容: 是否可以将字符串转换为字节数组,然后在Java或Android中将其转换回原始字符串? 我的目标是将一些字符串发送到微控制器(Arduino)并将其存储到EEPROM(仅1 KB)中。我尝试使用MD5哈希,但它似乎只是一种单向加密。我该怎么办? 问题答案: 我建议使用字符串的成员,但 使用显式编码 : 通过使用一种显式编码(以及一种支持所有Unicode的编码),您可以避免仅调用等问题

  • 本文向大家介绍C#枚举到字符串并返回,包括了C#枚举到字符串并返回的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 问题内容: 目标是将a转换为a ,将其在数据的a个活动之间传递,然后在以后的阶段将其重新转换回a 以便显示在中。 问题是,每当我尝试这样做时,我只会得到一个空位图和无描述性,无用的日志输出: (特别是因为在这种情况下没有必要)。 我已经运行了以下测试案例,该案例肯定将问题缩小为转换和还原代码。根据我的调试,解码正确,字节数组的大小正确且已满,位图配置被强制设置为相同,只是失败了: 前正确显示图像,