使用文本文件将二进制转换为十进制



我正在创建一个由两个java文件组成的程序。第一种方法涉及创建一个类,该类接受来自用户的二进制数据并返回其十进制值。第二个涉及创建一个类,该类从文本文件中读取二进制字符串列表,并将其十进制值写入控制台。这个类应该调用第一个java类的方法来完成它的任务,并且应该能够指出这个文件中的字符串是否有一个不是二进制的。

我已经完成了第一个java类,但是我在第二个类上遇到了困难,特别是我如何让程序从文本文件中读取每个单独的String,然后打印出它们的值或声明它们不是二进制文件。我还需要一些关于如何从第一个类调用方法的帮助。有人能给我指个方向吗?

下面是两个代码:

类1:

import java.util.*;
public class BinaryDecoder {
public static void main(String[] args) {

Scanner input = new Scanner(System.in);

System.out.print("Enter a binary: ");
String binary = input.nextLine();

System.out.println("---------------");

boolean isBinary = binaryDetector(binary);

if(isBinary) {
int count = 0;
for(int i=0; i<binary.length(); i++) {
if(binary.charAt(i) != ' ') {
count++;
}
}
int binarySize = Integer.valueOf(count);
System.out.println("Binary size: " + binarySize);

int decimalValue = binaryToDecimal(binary);

System.out.println("Value = " + decimalValue);
}
else {
System.out.println("Not a binary");
}

}

public static boolean binaryDetector(String x) {
int copyOfInput = Integer.valueOf(x);

while(copyOfInput != 0) {
if(copyOfInput % 10 > 1) {
return false;
}
copyOfInput = copyOfInput/10;
}
return true;
}

public static int binaryToDecimal(String n) {
String num = n;
int dec_value = 0;

int base = 1;

int len = num.length();
for(int i = len - 1; i>= 0; i--) {
if(num.charAt(i) == '1') {
dec_value += base;
}
base = base * 2;
}
return dec_value;
}
}

二班

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class BinaryToDecimalTester {
public static void main(String[] args) throws Exception{
Scanner inFile = new Scanner(new File("Strings.txt"));
while(inFile.hasNext()) {
String inString = inFile.next();
}
}
}

作为参考,我们假设文本文件中有这些数字:

1011010011101
1011101110101
1201234000100
1234456000110
1011010100011

如果您需要更多的说明或信息,请告诉我。非常感谢大家!

为了在BinaryToDecimalTester中使用来自BinaryDecoder的方法,您必须导入它们。例如,最好的方法是在每个类中声明package并使用它导入译码器类:

package binarynumbers;
import java.util.*;
public class BinaryDecoder {
public static void main(String[] args) { ...

,然后在BinaryToDecimalTester中导入特定的(或全部)方法:

package stackoverflow;

import java.io.File;
import java.util.Scanner;
import static stackoverflow.BinaryDecoder.binaryToDecimal;
public class BinaryToDecimalTester { ...

以这种方式导入它可以让你像你期望的那样正常使用它:

System.out.println(binaryToDecimal(inString));

包和导入的概念比这更复杂,对于编写程序是必不可少的。

至于从文本文件中读取每一行作为字符串并处理它,如果你的类是足够的,FileInputReader是从文件中读取的另一个选项之一。我的例子是:

package binarynumbers;

import java.io.BufferedReader;
import java.io.FileReader;
import static binarynumbers.BinaryDecoder.binaryToDecimal;
import static binarynumbers.BinaryDecoder.binaryDetector;
public class BinaryToDecimalTester {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new FileReader("Strings.txt"));
String line = "";
while ((line = br.readLine()) != null)
{
System.out.println(binaryDetector(line));
System.out.println(binaryToDecimal(line));
}
}
}

在实现检测二进制数的方法方面,我可以推荐本文

您必须选择哪个类应该作为您的main。

如果你保留2作为main,然后代替main in 1,你可以读取2中的两个文件,并使用你在1中创建的静态方法,通过在2中导入它们。

进口BinaryDecoder.binaryToDecimal;

我建议您在尝试转换值时检查二进制数字。如果数字不是二进制,则抛出异常并打印消息。

不需要先检查再转换值

这里有一个简单的转换方法。

public static int binaryToDecimal(String n) {
int val = 0;
for(char c : n.toCharArray()) {
if (c != '1' && c != '0') {
throw new IllegalArgumentException("Number not binary");
}
val = val*2;
val += c-'0';
}
return val;
}

现在需要做的就是读入值并调用该方法。你也可以返回一个可选的。

public static OptionalInt binaryToDecimal(String n) {
int val = 0;
for(char c : n.toCharArray()) {
if (c != '1' && c != '0') {
return OptionalInt.empty();
}
val = val*2;
val += c-'0';
}
return OptionalInt.of(val);
}

现在在打印结果之前检查返回的Optional是否为空。为了从文件中读取值,我建议使用扫描器实例。下面是一个使用问题中提到的数据以及所需导入的示例。

import java.io.File;
import java.io.IOException;
import java.util.OptionalInt;
import java.util.Scanner;
try (Scanner input = new Scanner(new File("f:/numbers.txt"))) {
while (input.hasNextLine()) {
String str = input.nextLine();
OptionalInt op = binaryToDecimal(str);
System.out.printf("%s -> %s%n", str, op.isPresent() ?
op.getAsInt() : "Non binary string");
}
} catch (IOException ie) {
ie.printStackTrace();
}

打印

1011010011101 -> 5789
1011101110101 -> 6005
1201234000100 -> Non binary string
1234456000110 -> Non binary string
1011010100011 -> 5795

最新更新