字节文字上的编译器错误“不兼容的类型”

时间:2014-09-29 14:15:42

标签: java byte bytearray bit

我见过许多情况,其中声明了一个字节但是来自类似方法的值 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位整数。 有没有其他解决方案,我可以直接向变量/数组提供位?

4 个答案:

答案 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