import java.io.*;
public class Main2 {
public static void main(String[] args) throws Exception {
DataOutputStream dos = new DataOutputStream(new FileOutputStream("Text.t"));
dos.writeByte(10101010);
DataInputStream dis = new DataInputStream(new FileInputStream("Text.t"));
int line;
System.out.println(dis.readByte());
dos.close();
dis.close();
}
}
我正在尝试在我创建和打印其内容的二进制文件中编写10101010。 当我运行它显示18 ..为什么?为什么不10101010?而且当我用textpad打开Text.t文件时 它包含了这个"垃圾"而不是10101010。
答案 0 :(得分:2)
10101010%256 = 18.这是您创建的整数的低字节。文本文件以"垃圾"提交。因为你把它保存为二进制数据而不是文本。
如果您希望将您的号码保存为二进制字符串,则应使用FileWriter
和FileReader
而不是DataInput / OutputStream,并使用Integer.toBinaryString(int)和Integer.parseInt (STR,2);
答案 1 :(得分:0)
这是因为你正在打印二进制文件,然后读出二进制文件。二进制代码10101010
对应于您正在看到的箭头,但当它被读回时,它由Java处理,因此以数字形式出现,而不是ASCII(或Unicode,取决于它是如何编码的默认)表示。
答案 2 :(得分:0)
您正在向文件Text.t
写入一个字节。如果您在 text 编辑器中打开该文件,那么根据编辑器决定使用的任何字符编码,您将看到该字节的单字符表示。
如果要查看八位数的0和1字符串,则需要文本文件而不是二进制文件,并且应该将数据输出为String
。
此外,Java不会将您的号码识别为二进制文字。值10101010
是十进制字面值,表示略大于一千万的数字。传递给dos.writeByte()
时,它将被截断为单个字节。如果您确实想要输出二进制表示为10101010
的单字节,那么您可以将其表示为0b10101010
或十六进制文字:
dos.writeByte(0b10101010);
或
dos.writeByte(0xAA);
答案 3 :(得分:0)
以二进制形式打开文件或其他数据流并不意味着您的整数操作现在都采用二进制数系统表示的值进行输入。它只是意味着您正在使用的数据不是人类可能读取的数据。
writeByte
上的DataOutputStream
方法接受int
输入并将其作为字节写出。因此,您的调用dos.writeByte(10101010);
会写入十进制整数值10101010
的最低有效8位。这个值碰巧是0b00010010
,它是18的二进制值。这就是来自的地方。
如果要在文件中表达二进制值0b10101010
,则需要写入整数值170:dos.writeByte(170)
或dos.writeByte(0xaa)
。
您对readByte
的电话遇到了同样的问题。它读取一个字节,System.out.println
将输出表示该字节的任何字符。如果要打印出字节的二进制值,请参阅this other SO question。
答案 4 :(得分:0)
由于您在十进制整数上调用writeByte()
,因此会得到意外结果。 WriteByte()
在1字节或8位的空间中写入整数。十进制数10101010与二进制数1001 1010 0010 0001 0001 0010
相同,其最后8位为0001 0010
,十进制数为18。
要解决这个问题,让java将您的10101010解释为二进制数字,并在其前面加上0b将其转换为binary literal。
dos.writeByte(0b10101010);
然后以十进制字符串形式读回此数据,您可以使用
Byte b = (dis.readByte());
String decimalString = String.format("%8s", Integer.toBinaryString(b1 & 0xFF)).replace(' ', '0');
System.out.println(decimalString);
字符串转换由JoãoSilva提供this question