【问题标题】:Why isn't my binary to English code working? [closed]为什么我的二进制到英文代码不起作用? [关闭]
【发布时间】:2014-10-17 12:24:08
【问题描述】:

我正在尝试制作一个可以将英语转换为我的自定义二进制文件的翻译器,反之亦然。它可以将英语翻译成二进制,但不能将二进制翻译成英语。有人可以帮助我并告诉我我做错了什么吗?

我想输入诸如“01000 00101 01100 01100 01111”之类的内容并得到“HELLO”作为输出。现在程序只允许我一次输入一个字符。例如,我输入“01000”,我得到 h。但是当我输入像“01000 00101”这样的东西时,我得到了同样的东西。我想知道如何解决这个问题。

代码如下:

import java.util.Scanner;


public class Translator
{
    public static void main ( String [] args )

    {
        Scanner input = new Scanner( System.in );
        System.out.print( "Would you like to convert English to Binary (yes or no)? " );
        String answer = input.nextLine();
        if( answer.equals( "yes" ) )
        {
        System.out.println( "Enter English text here: " );
        String english = input.nextLine();
        System.out.println( stringToBinary( english ) );
        }
        if (answer.equalsIgnoreCase( "no" ) )
        {
            System.out.print( "Binary to English? " );
            String answer2 = input.nextLine();
            if (answer2.equalsIgnoreCase( "yes" ) )
            {
                System.out.println( "Enter Binary text here: " );
                // enter binary here
                String code = input.nextLine();
                System.out.println( stringToEnglish( code ) );
            }
        }
    }

    public static String encode (String toEncode)
    {
        String binary = toEncode;

        if (toEncode.equalsIgnoreCase("a"))
            binary = "00001";
        if (toEncode.equalsIgnoreCase("b"))
            binary = "00010";
        if (toEncode.equalsIgnoreCase("c"))
            binary = "00011";
        if (toEncode.equalsIgnoreCase("d"))
            binary = "00100";
        if (toEncode.equalsIgnoreCase("e"))
            binary = "00101";
        if (toEncode.equalsIgnoreCase("f"))
            binary = "00110";
        if (toEncode.equalsIgnoreCase("g"))
            binary = "00111";
        if (toEncode.equalsIgnoreCase("h"))
            binary = "01000";
        if (toEncode.equalsIgnoreCase("i"))
            binary = "01001";
        if (toEncode.equalsIgnoreCase("j"))
            binary = "01010";
        if (toEncode.equalsIgnoreCase("k"))
            binary = "01011";
        if (toEncode.equalsIgnoreCase("l"))
            binary = "01100";
        if (toEncode.equalsIgnoreCase("m"))
            binary = "01101";
        if (toEncode.equalsIgnoreCase("n"))
            binary = "01110";
        if (toEncode.equalsIgnoreCase("o"))
            binary = "01111";
        if (toEncode.equalsIgnoreCase("p"))
            binary = "10000";
        if (toEncode.equalsIgnoreCase("q"))
            binary = "10001";
        if (toEncode.equalsIgnoreCase("r"))
            binary = "10010";
        if (toEncode.equalsIgnoreCase("s"))
            binary = "10011";
        if (toEncode.equalsIgnoreCase("t"))
            binary = "10100";
        if (toEncode.equalsIgnoreCase("u"))
            binary = "10101";
        if (toEncode.equalsIgnoreCase("v"))
            binary = "10110";
        if (toEncode.equalsIgnoreCase("w"))
            binary = "10111";
        if (toEncode.equalsIgnoreCase("x"))
            binary = "11000";
        if (toEncode.equalsIgnoreCase("y"))
            binary = "11001";
        if (toEncode.equalsIgnoreCase("z"))
            binary = "11010";
        if (toEncode.equalsIgnoreCase(""))
            binary = " ";

        return binary;
    }


    public static String stringToBinary( String text )
    {

        String newText = "";
        String selectedChar;
        String convertedChar;
        for (int i = 0; i < text.length(); i++)
        {


            selectedChar = text.charAt(i) + "";


            convertedChar = encode(selectedChar);

            if (convertedChar.equals(" ")) 
            {
                newText = newText + " ";
            }

            else
            {
                newText = newText + convertedChar;
                if (!convertedChar.equals(" "))
                {
                    newText = newText + " ";
                }
            }
        }

        return newText;
    }

    public static String stringToEnglish( String text )
    {

        String english = text;

        if (text.equalsIgnoreCase("00001"))
            english = "a";
        if (text.equalsIgnoreCase("00010"))
            english = "b";
        if (text.equalsIgnoreCase("00011"))
            english = "c";
        if (text.equalsIgnoreCase("00100"))
            english = "d";
        if (text.equalsIgnoreCase("00101"))
            english = "e";
        if (text.equalsIgnoreCase("00110"))
            english = "f";
        if (text.equalsIgnoreCase("00111"))
            english = "g";
        if (text.equalsIgnoreCase("01000"))
            english = "h";
        if (text.equalsIgnoreCase("01001"))
            english = "i";
        if (text.equalsIgnoreCase("01010"))
            english = "j";
        if (text.equalsIgnoreCase("01011"))
            english = "k";
        if (text.equalsIgnoreCase("01100"))
            english = "l";
        if (text.equalsIgnoreCase("01101"))
            english = "m";
        if (text.equalsIgnoreCase("01110"))
            english = "n";
        if (text.equalsIgnoreCase("01111"))
            english = "o";
        if (text.equalsIgnoreCase("10000"))
            english = "p";
        if (text.equalsIgnoreCase("10001"))
            english = "q";
        if (text.equalsIgnoreCase("10010"))
            english = "r";
        if (text.equalsIgnoreCase("10011"))
            english = "s";
        if (text.equalsIgnoreCase("10100"))
            english = "t";
        if (text.equalsIgnoreCase("10101"))
            english = "u";
        if (text.equalsIgnoreCase("10110"))
            english = "v";
        if (text.equalsIgnoreCase("10111"))
            english = "w";
        if (text.equalsIgnoreCase("11000"))
            english = "x";
        if (text.equalsIgnoreCase("11001"))
            english = "y";
        if (text.equalsIgnoreCase("11010"))
            english = "z";
        if (text.equalsIgnoreCase(" "))
            english = " ";

        return english ;
    }

}

【问题讨论】:

  • 如果反对的选民能说明原因,那肯定会有所帮助。至于您的问题,我们需要知道您期望的输出是什么,然后才能说出它为什么不起作用
  • 使用调试器一步步运行你的代码,你就会发现哪里出了问题。
  • 不是一个完整的答案,所以这是一个评论,但这应该帮助 - StringBuilder 和一个循环。
  • @jdphenix 你建议我在哪里插入?我才刚刚开始。
  • stringToEnglish() 方法的结构应该类似于 stringToBinary() 方法 - 在 stringToBinary() 中,您将每个字符转换为您的表示形式 - 现在在 stringToEnglish() 中进行逆向处理

标签: java binary converter


【解决方案1】:

您的stringToEnglish 方法仅计算单个字符,因此它永远不会返回超过该字符的有效结果。您需要的是一个循环、一个StringBuilder 以及您的比较中的一些变化。

首先,使用StringBuilder 是构建字符串的最佳选择。字符串是不可变的,因此实际上每次添加一个新实例时都会返回一个新实例。 StringBuilder 是一种解决方法。

public static String stringToEnglish( String text )
{
    StringBuilder builder = new StringBuilder();
    ...

我们还需要注意您需要处理两个实例:

  1. 当您的字符串以“”开头时
  2. 当你的字符串是二进制“00001”

所以你需要处理多个字符的循环看起来像......

for (int i = 0; i < text.length() - 4; ++i) { 
...

一种优化是在字符串为二进制时跳转到字符串的末尾。 我们还需要考虑通过查看子字符串来迭代原始字符串...

if (text.charAt(i) == ' ') {
    continue;
} else if (text.substring(i, i + 5).equalsIgnoreCase("00001")){
    builder.append( "a" );   
}
...

首先,我们将查看它是否以" " 开头,如果是则继续。使用 else if 而不是 ifs 链来避免不必要的比较。如果不是,我们知道它是二进制表示,需要将其作为子字符串拉出来并针对您的“表”进行测试;当你找到它时 - 附加它。

我们会一直走到尽头,尽我们所能,然后我们将归还我们所建造的......

    return builder.toString() ;
}

您也可以使用 switchbreak ,或者更好地使用我在评论中的建议,而不是长 if 链。

【讨论】:

  • 非常感谢您回答我的问题!我的程序按我的计划运行!感谢您的努力。
猜你喜欢
  • 2023-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多