首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在不丢失“位”的情况下将char[]转换为byte[]

在不丢失“位”的情况下将char[]转换为byte[]
EN

Stack Overflow用户
提问于 2012-07-17 14:50:36
回答 2查看 6.3K关注 0票数 1

我正在用Java开发一个Android2.3.3应用程序。

这个应用程序是一个iOS代码,没有符号的数据类型端口到Java。

在iOS上,它与UInt16UInt8一起工作。在一种情况下,我使用的是byte[],而不是char[]

但是要知道,我必须使用char[]作为byte[]发送DatagramPacket

如果char[]的一个元素是128个,我如何才能插入到byte[]中,而接收方得到128个。我不知道如果我这么做会发生什么

代码语言:javascript
运行
复制
char c = (char)128;
byte b = (byte)c;

哪个是b值?

128 = 10000000。B= -1或b= 127?

如何在不丢失任何char[]位的情况下将byte[]转换为

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-17 17:22:14

在Java中,char是一个无符号的16位数量。因此,您可以直接将uint16转换为char,而无需做任何其他操作。

对于未签名的8位数量,您有两个选项:

  1. 使用byte。它还能容纳8位。你不会因为签了字就失去任何部分。但是,如果您使用它进行算术,您需要记住,byte将自动扩展到int并对其进行扩展。为了防止这种情况,总是用这样的方式来掩饰: 字节b;int =5* (b & 0xFF);
  2. 使用char。它是无符号的,可以容纳16位,所以8位将很好地适应那里。要将byte放入char,只需执行以下操作: 字节b;char c= (char)(b & 0xFF);//屏蔽低阶8位

要将char放入byte中,只需执行以下操作:

代码语言:javascript
运行
复制
char c;
byte b = (byte)c; // Truncates to 8 bits

请注意,byte在Java中是签名的,因此每当您使用它进行算术运算时,您只需要屏蔽低阶8位(以防止符号扩展)。如下所示:

代码语言:javascript
运行
复制
byte b;
int foo = (b & 0xFF);

您可以使用一个字节执行所有正常的按位操作,而不必掩码:

代码语言:javascript
运行
复制
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)
票数 8
EN

Stack Overflow用户

发布于 2012-07-17 14:56:02

我认为您需要重新考虑您的方法,这样就不需要将char[]转换为byte[]了。

如果您的数据确实是字符,那么您需要查看各种序列化技术,例如使用new String(char[])创建字符串,然后使用getBytes(Charset)获取由给定Charset编码的字节(当然,相同的字符在ASCII或UTF-8或UTF-16中编码时会产生不同的字节,等等)。

但是从你的问题上看,听起来你并不是真的在使用字符,你只是把char作为一个16位的类型。如果是这样的话,进行转换并不困难,如下所示:

代码语言:javascript
运行
复制
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,则反转掩码。

但再次,我想看看你的整体方法,并试图避免这一点。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11525186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档