Java - 将 int 转换为字节数组而不考虑符号

标签 java arrays

要将 int 转换为字节数组,我使用以下代码:

int a = 128;
byte[] b = convertIntValueToByteArray(a);
private static byte[] convertIntValueToByteArray(int intValue){
  BigInteger bigInteger = BigInteger.valueOf(intValue);
  byte[] origByteArray = bigInteger.toByteArray();
  byte[] noSignByteArray = new byte[bigInteger.bitLength()/8];

  if(bigInteger.bitLength()%8!=0){
    noSignByteArray = origByteArray;
  }else{
    System.arraycopy(origByteArray,1,noSignByteArray,0,noSignByteArray.length);
  }

  return noSignByteArray;
}

我正在尝试做两件事。

1)我需要知道原始整数的字节数(四舍五入到结束字节)。但是,当我调用 toByteArray() 方法时,我不需要为符号位添加额外的位。这就是我使用辅助方法的原因。因此,在这个例子中,如果我没有辅助方法,当我将 128 转换为字节数组时,由于符号位,我得到的长度为 2 个八位字节,但我只期望它是 1 个八位字节。

2)我需要数字的正数表示。在此示例中,如果我尝试打印数组 b 中的第一个元素,则会得到 -128。然而,我将使用的数字只是正数,所以我实际想要的是 128。我仅限于使用字节数组。有办法做到这一点吗?

更新帖子

感谢您的回复。我还没有找到我正在寻找的确切答案,因此我将尝试提供更多详细信息。最终,我想通过数据输出流写入不同类型的值。在这篇文章中,我想澄清将整数写入数据输出流时会发生什么。我遇到过两种情况。

1)

DataOutputStream os = new DataOutputStream(this.socket.getOutputStream());

byte[] b = BigInteger.valueOf(128).toByteArray();

os.write(b);

2)

DataOutputStream os = new DataOutputStream(this.socket.getOutputStream());
os.write(128);

在第一种情况下,当从数据输入流读取字节时,字节数组中的第一个元素似乎是 0 来表示 msb,数组中的第二个元素包含数字 -128。然而,由于 msb 为 0,我们可以确定它是一个正数。在第二种情况下,没有 msb,并且从输入流读取的字节数组中存在的唯一元素是 -128。我期望数据输出流的 write() 方法能够以与 BigInteger 对象上的 toByteArray() 方法相同的方式将 int 转换为字节数组。然而,情况似乎并非如此,因为 MSB 不存在。所以我的问题是,在第二种情况下,如果没有 msb,我们如何知道 128 应该是正数而不是负数。

最佳答案

你可能已经知道了

  • 在八位字节中,模式 10000000 可以解释为 128 或 -128,具体取决于,呃,外部解释
  • Java 的 byte 类型仅将八位字节解释为 -128...127 范围内的值。

如果您正在构建一个应用程序,其中整个世界仅由非负整数组成,那么您可以简单地在字节值 -128 表示 128 的假设下完成所有工作,并且 - 127 意味着 129,...-1 意味着 255。这当然是可行的,但需要工作。

像这样处理“无符号字节”的概念通常是通过将字节扩展为 shortint 并将高阶位全部设置为零来完成的然后执行算术或显示您的值。您需要决定这种方法是否比仅将 128 表示为数组中的两个八位字节更符合您的喜好。

关于Java - 将 int 转换为字节数组而不考虑符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10789618/

相关文章:

java - 如何使用 Java 将 xml 样式表包含到 XML 文件中

c - 如何在c中初始化结构体中数组的所有值

javascript - 我怎样才能让这个功能发挥作用?

java - 使用 EAR 库配置 Helios WTP 实用程序项目的构建路径

java - 如何获取 Google Talk 历史记录?

c++ - 动态数组 C++,new Obj[size] 的问题只创建 1 个对象指针,而不是数组

c++ - C++ 中对象/类的动态数组

PHP解析sql结果集

java - 使用内部有模拟的模拟进行单元测试

java - Hibernate 不查找属性值