user1214845
user1214845

Reputation:

From string to ASCII to binary back to ASCII to string in Java

I have sort of a funky question (that I hope hasn't been asked and answered yet). To start, I'll tell you the order of what I'm trying to do and how I'm doing it and then tell you where I'm having a problem:

  1. Convert a string of characters into ASCII numbers
  2. Convert those ASCII numbers into binary and store them in a string
  3. Convert those binary numbers back into ASCII numbers
  4. Convert the ASCII numbers back into normal characters

Here are the methods I've written so far:

public static String strToBinary(String inputString){

    int[] ASCIIHolder = new int[inputString.length()];

    //Storing ASCII representation of characters in array of ints
    for(int index = 0; index < inputString.length(); index++){
        ASCIIHolder[index] = (int)inputString.charAt(index);
    }


    StringBuffer binaryStringBuffer = new StringBuffer();

    /* Now appending values of ASCIIHolder to binaryStringBuffer using
     * Integer.toBinaryString in a for loop. Should not get an out of bounds
     * exception because more than 1 element will be added to StringBuffer
     * each iteration.
     */
    for(int index =0;index <inputString.length();index ++){

        binaryStringBuffer.append(Integer.toBinaryString
                (ASCIIHolder[index]));
    }


    String binaryToBeReturned = binaryStringBuffer.toString();

    binaryToBeReturned.replace(" ", "");

    return binaryToBeReturned;
}

public static String binaryToString(String binaryString){

    int charCode = Integer.parseInt(binaryString, 2);

    String returnString = new Character((char)charCode).toString();

    return returnString;
}

I'm getting a NumberFormatException when I run the code and I think it's because the program is trying to convert the binary digits as one entire binary number rather than as separate letters. Based on what you see here, is there a better way to do this overall and/or how can I tell the computer to recognize the ASCII characters when it's iterating through the binary code? Hope that's clear and if not I'll be checking for comments.

Upvotes: 0

Views: 5469

Answers (2)

Sidd Viswanathan
Sidd Viswanathan

Reputation: 11

So I used OP's code with some modifications and it works really well for me. I'll post it here for future people. I don't think OP needs it anymore because he probably figured it out in the past 2 years.

public class Convert
    {
    public String strToBinary(String inputString){

    int[] ASCIIHolder = new int[inputString.length()];

    //Storing ASCII representation of characters in array of ints
    for(int index = 0; index < inputString.length(); index++){
        ASCIIHolder[index] = (int)inputString.charAt(index);
    }

    StringBuffer binaryStringBuffer = new StringBuffer();

    /* Now appending values of ASCIIHolder to binaryStringBuffer using
     * Integer.toBinaryString in a for loop. Should not get an out of bounds
     * exception because more than 1 element will be added to StringBuffer
     * each iteration.
     */
    for(int index =0;index <inputString.length();index ++){

        binaryStringBuffer.append(Integer.toBinaryString
                (ASCIIHolder[index]));
    }

    String binaryToBeReturned = binaryStringBuffer.toString();

    binaryToBeReturned.replace(" ", "");

    return binaryToBeReturned;
}

public String binaryToString(String binaryString){
    String returnString = "";
    int charCode;
    for(int i = 0; i < binaryString.length(); i+=7)
    {
    charCode = Integer.parseInt(binaryString.substring(i, i+7), 2);
    String returnChar = new Character((char)charCode).toString();
    returnString += returnChar;
    }
    return returnString;
}
}

I'd like to thank OP for writing most of it out for me. Fixing errors is much easier than writing new code.

Upvotes: 1

Jon Skeet
Jon Skeet

Reputation: 1500375

You've got at least two problems here:

  • You're just concatenating the binary strings, with no separators. So if you had "1100" and then "0011" you'd get "11000011" which is the same result as if you had "1" followed by "1000011".
  • You're calling String.replace and ignoring the return result. This sort of doesn't matter as you're replacing spaces, and there won't be any spaces anyway... but there should be!

Of course you don't have to use separators - but if you don't, you need to make sure that you include all 16 bits of each UTF-16 code point. (Or validate that your string only uses a limited range of characters and go down to an appropriate number of bits, e.g. 8 bits for ISO-8859-1 or 7 bits for ASCII.)

(I have to wonder what the point of all of this is. Homework? I can't see this being useful in real life.)

Upvotes: 0

Related Questions