【问题标题】:Byte arrays in javajava中的字节数组
【发布时间】:2013-01-22 07:17:41
【问题描述】:

嘿,我需要将以下十六进制值存储在一个字节数组中 - 0xCAFEBABEDEADBEEF。

所以我试着像这样存储它。

byte[] v0 = {11001010,11111110,10111010,10111110,11011110,10101101,10111110,11101111};

其中 11001010 是二进制的 CA,11111110 是二进制等的 FE。

但是我得到一个错误,说 11001010 是一个 int,所以我认为这是因为字节在 java 中是有符号字节,我们只能有 +127 和 -128 之间的值。

那么有没有办法在java中做到这一点(也许使用无符号字节......如果它们存在!?) 谢谢大家。

【问题讨论】:

  • 这取决于您使用的 Java 版本。对于 1.7,您可以为每个二进制值添加前缀“0b”,否则您将不得不使用十六进制并在每个十六进制值前添加“0x”。

标签: java hex byte


【解决方案1】:

0b放在数字前面。您可能还需要转换为byte

byte[] v0 = {(byte)0b11001010,(byte)0b11111110,...};

0b 前缀表示它是二进制数。

如果你想让它更容易阅读,你可以使用0x作为十六进制:

byte[] v0 = {(byte)0xCA,(byte)0xFE,(byte)0xBA,(byte)0xBE,...};

如果您使用的 Java 版本低于 7,这里有一种方法(二进制形式):

byte[] v0 = {Byte.parseByte("11001010", 2),...);

【讨论】:

  • @user1974753 JLS 中的一个小警告。 0x0b 文字都被解释,然后符号扩展为 int 值。 Doorknob 添加的对byte 的强制转换将只占用符号扩展int 的最后8 位,所以这应该可以正常工作。
【解决方案2】:

文字 11001010 表示 int 类型和值 11,001,010 的小数 - 即 1100 万和一些东西。

如果您使用的是 Java 7,则可以使用 0b 前缀定义二进制文字,例如 0b11001010。为了提高可读性,您可以在值中加上下划线,例如0b_1100_1010

但是,请注意,即使是这种二进制(或十六进制)文字的类型仍然是 int。这一点,再加上字节在 Java 中(不幸地)signed(因此它们的值在-128 to 127 范围内)导致值大于127 的文字必须手动转换为byte:

// 0b_1001_0001 or 0x91 is 145 in decimal
byte b1 = (byte) 0b_1001_0001;
byte b2 = (byte) 0x91;

但是,该字节的值将是-111 (145 - 256)。要取回无符号值,您需要手动将模块(256)添加到值中:

int i1 = b1 + 256;
int i2 = b1 & 0xff;
// both i1 and i2 are 145

欲了解更多信息,请参阅this question

【讨论】:

  • 但是 byte[] v0 = {0xCA};给我以下错误:类型不匹配:无法从 int 转换为 byte ?????
  • @user1974753 用像(byte) 0xCA这样的字节进行类型转换。
  • 但是,11001010 = 202 是十进制的,CA 是十六进制的,所以我们可以在 java 中保存的最大字节为 +127,所以有什么方法可以将 11001010(十进制的 202)存储在一个字节?
【解决方案3】:

如果是逐字节写入,可以使用:

byte[] v0 = {0b11001010, 0b11111110, 0b10111010, ... }

byte[] v0 = {0xCA, 0xFE, ... }

【讨论】:

  • 但是 byte[] v0 = {0xCA};给我以下错误:类型不匹配:无法从 int 转换为 byte ?????
猜你喜欢
  • 1970-01-01
  • 2017-12-03
  • 2011-11-06
  • 2011-10-04
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多