2017-02-15 2 views
0

Я создал программу, которая принимает строку на Scanner и преобразует ее в ASCII-номера в двоичном формате, а также выводит частоту каждой буквы. Вот моя программа, как этоКак убрать недостающие ведущие нули в ascii в java

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."); 
      } 
     } 
    } 
} 

Как мы все знаем, каждый из ASCII должен быть длиной 7 бит длиной, но для моей программы это не всегда так, как это не ловя ведущие нули. Например, если бы я передать в строке «привет» ожидаемый результат должен быть

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

, но я получаю:

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

, как вы можете видеть, «100000» только 6 бит в длину, а некоторые из моих значений ascii просто неправильны из-за этой недостающей главной проблемы нулей.

Я не уверен, как бы я решил исправить эту проблему, и именно поэтому я здесь. Если бы кто-нибудь мог показать мне, как это можно исправить, это было бы здорово.

+0

Что происходит при использовании: System.out.print (Integer.toString (ascii, 2) + ""); –

+0

Да, имеется 128 кодовых точек ASCII с номером 0-127 и закодировано как значения 0-127. Но у вас есть несколько настойчив в вашей программе, исходя из предположения, что Java использует ASCII. Java, JavaScript, .NET, XML, HTML, ... используют [Unicode] (http://www.unicode.org/charts/nameslist/index.html). 'charAt (i)' возвращает код UTF-16, один или два из которых кодируют код Unicode, например A или € или. Если вы хотите иметь дело только с подмножеством, например с C0 Controls и Basic Latin block, вы должны поместить в свою программу защитника (if-throw или аналогичного). –

ответ

-1
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

, используя этот подход, он на самом деле печатает 8 бит на букву вместо 7, можно ли исправить это, чтобы он печатал 7? –

+0

конечно, опечатка здесь. спасибо за исправление – kamehl23

0

Вы должны либо остановить преобразование строк в Интс и сравнивать строки непосредственно, или преобразовать K в строку, добавьте необходимое количество ведущих нулей, а затем преобразовать их в голец.

Смежные вопросы