字符数组与字节数组

时间:2015-02-19 20:21:32

标签: java c++ android-ndk

我已经找到了一些关于此的答案,但它们似乎都不适用于我的问题。

我正在使用NDK和C ++期待一个1024个元素的unsigned char数组,所以我需要在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无符号数组。

有什么建议吗? 感谢。

2 个答案:

答案 0 :(得分:2)

说“元素被添加为数值”是错误的。你可以肯定的唯一一点就是它会在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]中看到实际的'a'。

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

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

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

或者您可以阅读此问题的答案:Convert character to ASCII numeric value in java了解更多提示。

答案 1 :(得分:0)

适用于ASCII字符

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