我见过许多情况,其中声明了一个字节但是来自类似方法的值 intToByte 或 StringToByte 会转换为一个字节,因为程序员提供的是十六进制 - 值,整数 - 或字符串 - 值。
我试图为变量分配一个实际的字节值,而不需要任何转换或方法来解析,如下所示:
public class ByteTest {
/**
* This array will be used to hold three characters, together forming a string.
*/
private static byte[] string;
/**
* The main method of the program, where the byte-array is coming to use.
*/
public static void main(String args[]) {
//Construct the array with a limit to three bytes.
string = new byte[3];
/*
* Fill the three bytes with the binary values to create "O", "l" and "e".
*/
string[0] = 01001111;
string[1] = 01101100;
string[2] = 01100101;
//Print out "Ole".
System.out.println(string[0] + string[1] + string[2]);
}
}
但是我在编译器中遇到以下错误:
java\ByteTest.java:8: error: incompatible types: possible lossy conversion from int to byte
string[0] = 01001111;
^
java\ByteTest.java:9: error: incompatible types: possible lossy conversion from int to byte
string[1] = 01101100;
^
java\ByteTest.java:10: error: incompatible types: possible lossy conversion from int to byte
string[2] = 01100101;
^
显然,我认为是8位,编译器认为是8位整数。 有没有其他解决方案,我可以直接向变量/数组提供位?
答案 0 :(得分:7)
表示二进制
string[0] = 0b01001111;
string[1] = 0b01101100;
string[2] = 0b01100101;
这让我想起了这个笑话:有10种程序员:那些懂二进制的程序员和那些不懂的二进制程序员。
当字节被签名时,0b1xxxxxxx
仍然存在需要为负数的问题。在这种情况下,使用以下技巧:
string[2] = 0b11100101 - 256;
string[2] = (byte) 0b11100101; // Or simply cast the int range value.
二进制文件也是下划线用法的理想选择:
string[2] = 0b0110_0101; // 0x65
由@BackSlash评论:字节是二进制数据。要将它们解释为文本,它们必须与某些字符集/编码相关联。
String s = new String(string, StandardCharsets.US_ASCII);
System.out.println(s);
这会转换字节,将它们解释为ASCII到String使用的Unicode(组合世界上所有脚本)。
答案 1 :(得分:0)
在常数前添加0(如01101100)将被解释为八进制值
答案 2 :(得分:0)
你需要做些什么来解决这个问题?
使用最少内存(代码和数据)的最简单的解决方案也是最简单的。
private static final String string = "Ole";
System.out.println(string);
否则你可以这样做
private static final char[] chars = {
(char) 0b01001111,
(char) 0b01101100,
(char) 0b01100101 };
String s = new String(chars);
System.out.println(s);
注意:Java中的字符是16位无符号char
,而不是8位byte
要了解为什么类文件更大,可以使用
转储类文件java -c -v -cp target/classes mypackage.MyClass
以01001111
开头是八进制,而不是二进制。要编写二进制数,您需要0b01001111
数字不会“记住”你给它多少前导零,一般来说,在打印时会丢弃前导零。
数字的默认格式是十进制,而不是二进制。
当您添加两个或三个数字时,您会得到另一个数字。假设你有这个编译它将打印类似
288
或任何值的总和。
顺便说一下,将int
命名为“字符串”真是令人困惑,因为这可以假设为String
答案 3 :(得分:0)
分配实际值: -
String a ="100101";
System.out.println(""+a);
Output :- 100101
二进制到整数转换,然后将值赋给字符串变量: -
String a=""+0b100101
System.out.println(""+a);
Output: 37