将字符串转换为字节数组时会发生什么

时间:2011-08-21 09:57:25

标签: bytearray string-conversion

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

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

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

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

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

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

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

但是我可以使用基础java,但我需要知道在理论层面发生了什么。

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

Gus

3 个答案:

答案 0 :(得分:2)

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

如果要将某些字符串数据存储在byte数组中,则需要能够将字符串的Unicode字符转换为字节序列。此过程称为 encoding ,有几种方法可以执行此操作,每种方法都有不同的规则和结果。如果两段代码想要使用字节数组共享字符串数据,则需要就正在使用的编码达成一致。

例如,假设我们要使用 UTF-8 编码对字符串s进行编码。 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,甚至可能根本无法解码。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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