【发布时间】:2013-03-03 22:51:20
【问题描述】:
我需要获取 0 到 255 之间数字的字节/8 位表示形式。在 Java 中是否有任何舒适的方法可以做到这一点?似乎大多数方法都适用于 4 字节长的整数?我的最终目标是将几个 8 位值写入一个文件。
感谢您对此的任何提示!
【问题讨论】:
我需要获取 0 到 255 之间数字的字节/8 位表示形式。在 Java 中是否有任何舒适的方法可以做到这一点?似乎大多数方法都适用于 4 字节长的整数?我的最终目标是将几个 8 位值写入一个文件。
感谢您对此的任何提示!
【问题讨论】:
完成亚历克斯的回答:
int i = 255;
byte b = (byte) i;
System.out.println("b = " + b); // b = -1
int i2 = b & 0xFF;
System.out.println("i2 = " + i2); // i2 = 255
【讨论】:
小心字节。它是签名,例如-128 到 127。如果你想要 0-255,当你打印出来时,你总是需要&255(就像 JB Nizet 在他的例子中所做的那样)
【讨论】:
byte 类型有什么问题?如果您只存储数据而不进行算术运算,并且出于其他原因不需要十进制表示,那么它是否已签名并不重要。
【讨论】:
1 字节 = 8 位 = 00000000~11111111(二进制)= 0~255(无符号字节) = 0x00~0xFF(十六进制)
C#:
1字节值是:0~255
Java:
1字节值是:-128~127
如果你想在java中得到0~255(无符号字节)的值:
字节 b = (字节) 值;
示例:字节 b = (字节) 200;
int b = 值 & 0xFF;
示例:int b = 200 & 0xFF;
【讨论】:
如果您要将其读入int,只需使用& 0xff 将其屏蔽。我建议在(In|Out)putStream 之间增加一层间接性。涵盖诸如字节顺序之类的细节。
在写入对象中:
public void unsignedByte(int value) throws IOException {
if (!(0 <= v && v <= 0xff) {
throw IllegalArgumentException();
}
out.write(v);
}
在读取对象中:
public int unsignedByte() throws IOException {
int v = in.read();
if (v == -1) {
throw EndOfFileException();
}
assert 0 <= v && v < 0xff;
return v;
}
【讨论】:
Java 字节的符号是从 -128 到 127,如果你想获得从 0 到 255 的表示,我使用这 2 个函数
public static byte fromIntToByte(String value) throws Exception {
return fromIntToByte(Integer.parseInt(value));
}
public static byte fromIntToByte(int value) throws Exception {
String stringByte = "";
if (value < 0 && value > 255) {
throw new Exception("Must be from 0<=value<=255");
}
if (value <= 127) {
for (int i = 0; i < 8; i++) {
stringByte = String.valueOf(value % 2) + stringByte;
value = value / 2;
}
} else {
value = value / 2;
for (int i = 0; i < 7; i++) {
stringByte = String.valueOf(value % 2) + stringByte;
value = value / 2;
}
stringByte = "-" + stringByte;
}
System.out.println(stringByte);
byte b = Byte.parseByte(stringByte, 2);
return b;
}
【讨论】: