我已经找到了一些关于此的答案,但它们似乎都不适用于我的问题。
我正在使用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无符号数组。
有什么建议吗? 感谢。
答案 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];