【问题标题】:What occurs when a string is converted to a byte array将字符串转换为字节数组时会发生什么
【发布时间】:2011-10-31 13:00:10
【问题描述】:

我认为这是一个新手类型的问题,但我很理解这一点。

我可以找到很多关于如何将字符串转换为各种语言的字节数组的帖子。

我不明白的是逐个字符发生了什么。 我知道屏幕上显示的每个字符都由一个数字表示,例如它的 ascii 代码。 (我们现在可以坚持使用 ASCII,所以我从概念上得到这个:-))

这是否意味着当我想表示一个字符或一个字符串(这是一个字符列表)时,会发生以下情况

将字符转换为 ASCII 值 > 将 ascii 值表示为二进制?

我已经看到通过将字节数组定义为输入字符串长度的 1/2 来创建字节数组的代码,所以字节数组肯定与字符串的长度相同吗?

所以我有点困惑。 基本上我试图将一个字符串值存储到 ColdFusion 中的一个字节数组中,我看不到它有一个明确的字符串到字节数组函数。

但是我可以了解底层的 java,但我需要知道在理论上发生了什么。

提前谢谢,如果你觉得我疯了,请告诉我!!

格斯

【问题讨论】:

    标签: bytearray string-conversion


    【解决方案1】:

    在 Java 中,字符串存储为 16 位 char 值的数组。字符串中的每个 Unicode 字符在数组中存储为一个或(很少)两个 char 值。

    如果您想在byte 数组中存储一些字符串数据,您需要能够将字符串的Unicode 字符转换为字节序列。这个过程称为encoding,有几种方法可以做到这一点,每种方法都有不同的规则和结果。如果两段代码想要使用字节数组共享字符串数据,它们需要就使用哪种编码达成一致。

    例如,假设我们有一个字符串s,我们想使用UTF-8 编码对其进行编码。 UTF-8 有一个方便的属性,如果你用它来编码一个只包含 ASCII 字符的字符串,输入中的每个字符都会被转换为具有该字符的 ASCII 值的单个字节。我们可以将我们的 Java 字符串转换为 Java 字节数组,如下所示:

    byte[] bytes = s.getBytes("UTF-8");
    

    字节数组bytes 现在包含来自s 的字符串数据,使用UTF-8 编码编码为字节。

    现在,我们在某处存储或传输字节,另一端的代码希望将字节解码回Java String。它将执行以下操作:

    String t = new String(bytes, "UTF-8");
    

    假设没有出错,字符串 t 现在包含与原始字符串 s 相同的字符串数据。

    请注意,两段代码必须就所使用的编码达成一致。如果他们不同意,生成的字符串可能会end up containing garbage,甚至可能根本无法解码。

    【讨论】:

    • 我想我在这方面得到了更好的处理。基本上我的任务是在 Wowza 媒体服务器之间传递一个加密密钥,并在 iPad 上说一个带有安全媒体的网页。Wowza 的说明是。密钥信息需要以二进制格式的 16 个八位字节的打包数组发送:谢谢再次感谢大家的帮助。
    【解决方案2】:

    你不是在狂吠。在所有事情中要记住字符串的关键是,对于计算机来说,字符不存在,只有数字存在。没有字符、字符串、文本或类似的东西实际上不是通过存储数字来实现的(实际上这适用于所有数据类型:布尔值实际上是范围非常小的数字,枚举是内部数字等)。这就是为什么说一段数据代表“A”或任何其他字符是没有意义的,你必须知道周围的代码假设的字符编码

    将字符串转换为字节数组恰好发生在有意透视(“这应该打印为 'A'”)和内部透视(“此存储单元包含 65”)之间的边界处。因此,要获得正确的结果,必须根据几种可能的字符集之一在它们之间进行转换,并选择正确的一种。请注意,JDK 提供了不需要字符集名称的便捷方法,并且始终使用从您的平台和环境变量推导出的默认字符集;但是知道你在做什么并明确说明字符集几乎总是一个更好的主意,而不是编写一些今天可以工作的东西,但当你在另一台机器上执行它时却神秘地失败了。

    【讨论】:

      【解决方案3】:

      字符串根据Charset 编码为字节数组。 charset 可以将 char 编码为更多或更少的位,然后是字节。

      例如,如果您只需要显示密码(10 个不同的字符),您可以使用定义每个字符 4 位的字符集,获得每个字节 2 个字符的表示。 默认情况下,通常在 String 到 byteArray 编码器中选择操作系统的字符集。 要取回字符串,您必须使用相同的字符集解码该字符串。

      【讨论】:

      • 我理解通过字符集将字符表示为数字的概念。以下逻辑是否有效。字节数组 =ba 字符串 = abc 将“a”转换为代表“a”的数字 ba[1] = 代表“a”的数字;通过字符串将“b”转换为代表“b”的数字 ba[2] = 代表“b”等的数字...顺便说一句,感谢您的时间
      • 根据您的示例, ba[1] 绝对不是第一个字符的表示。如果您有一个 1 char = 1 字节的字符集,它应该。 abc[1] 是第一个字符,您可以将其转换为字节。 ba[1] 是编码值的第一个字节。
      猜你喜欢
      • 2023-04-08
      • 2021-02-04
      • 2021-11-11
      • 2011-06-27
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 2018-10-31
      • 1970-01-01
      相关资源
      最近更新 更多