Stworzyłem program, który zajmuje wciśnięciu przez Scanner i przekształca go w numery ASCII w binarnym, a także wydrukuje częstotliwość każdej litery. Oto mój program, jak to jest

import java.util.*;

public class ASCII
{
    public static void main (String [] args)
    {
        Scanner sc = new Scanner (System.in);
        System.out.println("Enter your sentence: " );
        String myString = sc.nextLine();
        int length = myString.length();
        int ascii;
        char character;
        int[] myarray = new int[256];
        for(int i =0; i < length; i++)
        {
            character = myString.charAt(i);
            ascii = (int)character; // casting the character into an int
            System.out.print(Integer.toBinaryString(ascii) + " ");
            myarray[ascii]++; // counting the frequency of each letter in the string
        }

        System.out.println();

        for ( int k = 0; k < myarray.length; k++ )
        {
            if ( myarray[k] > 0 ) // if the frequency is greater than 0 do this print line, without this programm would print all 255 ascii characters.
            {
                System.out.println("'"+(char)k + "'" + " appeared " +    myarray[k]      + " times." );
            }
        }
    }
}

Jak wszyscy wiemy, każdy ASCII powinien mieć długość 7 bitów, ale dla mojego programu nie zawsze jest tak, jak nie przyciąga wiodących zer. Na przykład, gdybym miał przejść w ciągu "cześć tam" oczekiwany wynik powinien być

 "1101000 1100101 1101100 1101111 0100000 1110100 1101000 1100101 1110010   1110010 1100101"

Ale dostaję:

"1101000 1100101 1101100 1101100 1101111 100000 1110100 1101000 1100101 1110010 1100101"

Jak widać "100000" to tylko 6 bitów, a niektóre moje wartości ASCII są po prostu złe z powodu tego brakującego wiodącego zera

Nie jestem pewien, jak chciałbym naprawić ten problem i dlatego tu jestem. Jeśli ktoś może mi pokazać, jak można to było naprawić, byłoby świetnie.

0
Cathal Brady 15 luty 2017, 16:37

2 odpowiedzi

Najlepsza odpowiedź
public static void main (String [] args)
{
    String myString = "hello there";
    int length = myString.length();
    int ascii;
    char character;
    int[] myarray = new int[256];
    for(int i =0; i < length; i++)
    {
        character = myString.charAt(i);
        ascii = character; // casting the character into an int
        // not optimal, but works
        System.out.println(String.format("%7s", Integer.toBinaryString(ascii)).replace(' ', '0'));

        myarray[ascii]++; // counting the frequency of each letter in the string

    }
    System.out.println();

    for ( int k = 0; k < myarray.length; k++ )
    {
        if ( myarray[k] > 0 ) // if the frequency is greater than 0 do this print line, without this programm would print all 255 ascii characters.
        {
            System.out.println("'"+(char)k + "'" + " appeared " +    myarray[k]      + " times." );
        }
    }
}
0
kamehl23 15 luty 2017, 14:13

Powinieneś przestać konwertować struny do ints i porównować struny bezpośrednio lub konwertować k do ciągów, dołącz potrzebną ilość wiodących zera, a następnie przekonwertuj je do znaków.

0
Gyrotank 15 luty 2017, 13:47