Java 将字符[]转换为字节[],而不丢失';位';
我正在用Java开发一个Android 2.3.3应用程序 此应用程序是一个iOS代码,具有到Java的未签名数据类型端口 在iOS上,它与Java 将字符[]转换为字节[],而不丢失';位';,java,android,types,unsigned,Java,Android,Types,Unsigned,我正在用Java开发一个Android 2.3.3应用程序 此应用程序是一个iOS代码,具有到Java的未签名数据类型端口 在iOS上,它与UInt16和UInt8一起工作。在一种情况下,我使用的是char[] 但是我知道我必须使用 如果char[]的一个元素是128,我如何插入到byte[]中,接收方得到128。我不知道如果我这样做会发生什么: char c = (char)128; byte b = (byte)c; 哪个将是b值? 128 = 10000000. b=-1还是b=127
UInt16
和UInt8
一起工作。在一种情况下,我使用的是char[]
但是我知道我必须使用
如果char[]的一个元素是128,我如何插入到byte[]中,接收方得到128。我不知道如果我这样做会发生什么:
char c = (char)128;
byte b = (byte)c;
哪个将是b
值?128 = 10000000. b=-1还是b=127
如何将
char[]
转换为byte[]
而不丢失任何位?我认为您需要重新考虑您的方法,这样您就不需要将char[]
转换为byte[]
如果您的数据实际上是字符,那么您需要了解各种序列化技术,例如使用创建字符串,然后使用获取由给定字符编码的字节(当然,因为相同的字符在以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;
}
byte[]toBytes(char[]chars){
字节[]字节=新字节[chars.length*2];
int-ci,bi;
char ch;
bi=0;
对于(ci=0;ci>8);
字节[bi++]=(字节)(ch&0x00FF);
}
返回字节;
}
如果希望结果为小端点,请反转遮罩
但是,我会再次审视您的总体方法,并尽量避免这种情况。我认为您需要重新考虑您的方法,这样您就不需要将
char[]
转换为byte[]
如果您的数据实际上是字符,那么您需要了解各种序列化技术,例如使用创建字符串,然后使用获取由给定字符编码的字节(当然,因为相同的字符在以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;
}
byte[]toBytes(char[]chars){
字节[]字节=新字节[chars.length*2];
int-ci,bi;
char ch;
bi=0;
对于(ci=0;ci>8);
字节[bi++]=(字节)(ch&0x00FF);
}
返回字节;
}
如果希望结果为小端点,请反转遮罩
不过,我还是要看看您的总体方法,尽量避免这种情况。在Java
中,char
是一个无符号的16位量。因此,您可以直接将uint16
转换为char
,而无需执行任何其他操作
对于无符号8位数量,您有2个选项:
字节。它还包含8位。你不会因为签名而丢失任何信息。但是,如果您使用它进行算术运算,您需要记住Java将自动将字节
向上扩展为int
,并对其进行签名扩展。要防止出现这种情况,请始终按以下方式对其进行遮罩:
字节b;
int foo=5*(b&0xFF)
char
。它是无符号的,可以容纳16位,因此8位可以很好地放入其中。要将字节
放入字符
中,只需执行以下操作:
字节b;
字符c=(字符)(b&0xFF);//屏蔽低阶8位字符
放入字节
,只需执行以下操作:
char c;
byte b = (byte)c; // Truncates to 8 bits
请注意,Java中的byte
是有符号的,因此每当您对其进行算术运算时,您只需要屏蔽低位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)
字节b;
如果(b&0x80)..//测试旗帜
b |=0x40;//立旗
b^=0x20;//将标志从0翻转到1或从1翻转到0
b^=~0x10;//清除旗帜
字节x=b>>4;//右移4位并分配(无符号扩展)
在Java中,char
是一个无符号的16位数量。因此,您可以直接将uint16
转换为char
,而无需执行任何其他操作
对于无符号8位数量,您有2个选项:
字节。它还包含8位。你不会因为签名而丢失任何信息。但是,如果您使用它进行算术运算,您需要记住Java将自动将字节
向上扩展为int
,并对其进行签名扩展。要防止出现这种情况,请始终按以下方式对其进行遮罩:
字节b;
int foo=5*(b&0xFF)
char
。它是无符号的,可以容纳16位,因此8位可以很好地放入其中。要将字节
放入字符
中,只需执行以下操作:
字节b;
字符c=(字符)(b&0xFF);//屏蔽低阶8位字符
放入字节
,只需执行以下操作:
char c;
byte b = (byte)c; // Truncates to 8 bits
请注意,Java中的byte
是有符号的,因此每当您对其进行算术运算时,您只需要屏蔽低位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)
字节b;
如果(b&0x80)..//测试旗帜
b |=0x40;//立旗
b^=0x20;//将标志从0翻转到1或从1翻转到0
b^=~0x10;//清除旗帜
字节x=b>>4;//右移4位并分配(无符号扩展)
char
s不是字节。那☻代码>字符?您需要使用Unicode编码。@SLaks:听起来不像O