2011-08-21 34 views
2

我认为这是一个新手类型的问题,但我很理解这一点。将字符串转换为字节数组时发生了什么

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

我不明白的是一个字符的基础上发生了什么。 据我所知,屏幕上显示的每个字符都用一个数字表示,如ascii码。 (我们可以继续ASCII的时刻,所以我得到这个概念:-))

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

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

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

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

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

在此先感谢您,请告诉我,如果您认为我在狂吠!

格斯

回答

2

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

如果要将一些字符串数据存储在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,甚至可能根本无法解码。

+0

我认为我在这方面得到了更好的处理。基本上我的任务是在Wowza媒体服务器之间传递一个加密密钥,并在iPad上说出带有安全媒体的网页.. Wowza的指令是...... 关键信息需要作为16字节的打包数组发送二进制格式: 再次感谢大家,我非常感谢您的协助。 –

0

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

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

+0

我理解通过一个字符集将一个字符表示为一个数字的概念。以下逻辑是否有效? 字节数组= BA 串= ABC 转换 'a' 到代表 'A' BA的数[1] =代表性数量为 'A'; 转换“B”到代表“B” BA的数[2] =关于“B” 等通过串代表号码... 顺便说一句感谢您的时间 –

+0

根据你的例子,BA [1]不是绝对代表第一个字符。它应该如果你有一个char = 1字节的字符集。 abc [1]是第一个字符,您可以将其转换为一个字节。相反,ba [1]是编码值的第一个字节。 –

0

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

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

相关问题