Java 将字符[]转换为字节[],而不丢失';位';

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

我正在用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


如何将
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