我正在用Java开发一个Android2.3.3应用程序。
这个应用程序是一个iOS代码,没有符号的数据类型端口到Java。
在iOS上,它与UInt16
和UInt8
一起工作。在一种情况下,我使用的是byte[]
,而不是char[]
。
但是要知道,我必须使用char[]
作为byte[]
发送DatagramPacket。
如果char[]的一个元素是128个,我如何才能插入到byte[]中,而接收方得到128个。我不知道如果我这么做会发生什么
char c = (char)128;
byte b = (byte)c;
哪个是b
值?
128 = 10000000。B= -1或b= 127?
如何在不丢失任何char[]
位的情况下将byte[]
转换为
发布于 2012-07-17 17:22:14
在Java中,char
是一个无符号的16位数量。因此,您可以直接将uint16
转换为char
,而无需做任何其他操作。
对于未签名的8位数量,您有两个选项:
byte
。它还能容纳8位。你不会因为签了字就失去任何部分。但是,如果您使用它进行算术,您需要记住,byte
将自动扩展到int
并对其进行扩展。为了防止这种情况,总是用这样的方式来掩饰:
字节b;int =5* (b & 0xFF);char
。它是无符号的,可以容纳16位,所以8位将很好地适应那里。要将byte
放入char
,只需执行以下操作:
字节b;char c= (char)(b & 0xFF);//屏蔽低阶8位要将char
放入byte
中,只需执行以下操作:
char c;
byte b = (byte)c; // Truncates to 8 bits
请注意,byte
在Java中是签名的,因此每当您使用它进行算术运算时,您只需要屏蔽低阶8位(以防止符号扩展)。如下所示:
byte b;
int foo = (b & 0xFF);
您可以使用一个字节执行所有正常的按位操作,而不必掩码:
byte b;
if (b & 0x80) ... // Test a flag
b |= 0x40; // Set a flag
b ^= 0x20; // Flip a flag from 0 to 1 or 1 to 0
b ^= ~0x10; // Clear a flag
byte x = b << 3; // Shift left 3 bits and assign
byte x = b >>> 4; // Shift right 4 bits and assign (WITHOUT sign extension)
发布于 2012-07-17 14:56:02
我认为您需要重新考虑您的方法,这样就不需要将char[]
转换为byte[]
了。
如果您的数据确实是字符,那么您需要查看各种序列化技术,例如使用new String(char[])
创建字符串,然后使用getBytes(Charset)
获取由给定Charset
编码的字节(当然,相同的字符在ASCII或UTF-8或UTF-16中编码时会产生不同的字节,等等)。
但是从你的问题上看,听起来你并不是真的在使用字符,你只是把char
作为一个16位的类型。如果是这样的话,进行转换并不困难,如下所示:
byte[] toBytes(char[] chars) {
byte[] bytes = new byte[chars.length * 2];
int ci, bi;
char ch;
bi = 0;
for (ci = 0; ci < chars.length; ++ci) {
ch = chars[ci];
bytes[bi++] = (byte)((ch & 0xFF00) >> 8);
bytes[bi++] = (byte)(ch & 0x00FF);
}
return bytes;
}
如果您希望结果是小的-endian,则反转掩码。
但再次,我想看看你的整体方法,并试图避免这一点。
https://stackoverflow.com/questions/11525186
复制相似问题