字符数组与字节数组

Array of chars vs. array of bytes

我找到了一些关于此问题的答案,但其中 none 似乎适用于我的问题。

我正在使用 NDK,而 C++ 需要一个包含 1024 个元素的无符号字符数组,因此我需要在 java 中创建它以将其作为参数传递。

unsigned char 数组应包含数字和字符。

我试过这个:

byte[] lMessage = new byte[1024];
lMessage[4] = 'a'; 

问题是第 4 个元素被添加为数值而不是保持 'a' 字符。

我也试过了

char[] lMessage = new char[1024];
lMessage[4] = 'a'; 

虽然这保留了字符,但它确实复制了数组中的字节数,从 8 到 16。

我需要输出为 8 位 ASCII 无符号数组。

有什么建议吗? 谢谢

适用于 ASCII 字符

lMessage[4] = new String('a').getBytes()[0];

说元素"gets added as a numerical value"是错误的。唯一可以肯定的是,它会以静电荷的形式添加到 RAM 的八个单元格中。

您选择如何表示这八位 (01100001) 以便将它们可视化与它们的实际含义没有多大关系,因此如果您选择将它们视为数值,那么您可能被骗去相信它们实际上是一个数值。 (有点像 self-fulfilling prophecy (wikipedia)。)

但实际上它们只不过是 8 个静电电荷,可以用我们喜欢的任何方式解释。我们可以选择将它们解释为二进制补码(97),我们可以选择将它们解释为二进制编码的十进制数(61),我们可以选择将它们解释为ASCII字符('a'),我们可以选择将它们解释为 x86 指令操作码 (popa),这样的例子不胜枚举。

C++ 中最接近 unsigned char 的是 java 中的字节。那是因为这些小数据类型的基本特征是它们有多少位长。 C++ 中的字符是 8 位长,java 中唯一也是 8 位长的类型是字节。

不幸的是,java 中的一个字节往往被认为是一个数字量而不是一个字符,因此显示字节的工具(例如调试器)会将它们显示为小数字。但这只是一个任意约定:他们可以很容易地选择将字节显示为 ASCII(8 位)字符,然后您将在 byte[] lMessage[4].[=19 中看到实际的 'a' =]

所以,不要被工具显示的内容所迷惑,重要的是它是一个 8 位的数量。如果工具显示 97 (0x61),那么您就知道存储在这 8 个存储单元中的位模式可以合理地视为 'a',因为 'a' 的 ASCII 代码是97.

所以,最后,为了回答你的问题,你需要做的是找到一种方法将由 16 位 unicode 字符组成的 java 字符串转换为 ASCII 字符数组,这将是 java 中的字节。你可以试试这个:

String s = "TooManyEduardos";
byte[] bytes = s.getBytes("US-ASCII");

或者您可以阅读此问题的答案:Convert character to ASCII numeric value in java 以获得更多想法。