将一个字符串(如testing123)转换为二进制在Java中

44 java binary hex ascii

我希望能够将String(带有单词/字母)转换为其他形式,如二进制.我该怎么做呢 我在BLUEJ(Java)编码.谢谢

Nuo*_*oji 74

通常的方法是使用String#getBytes()获取底层字节,然后以其他形式(十六进制,二进制等)呈现这些字节.

请注意,getBytes()使用默认字符集,因此如果您希望将字符串转换为某些特定字符编码,则应该使用getBytes(String encoding),但很多时候(尤其是处理ASCII时)getBytes()就足够了(并且具有不抛出已检查异常的优点).

对于特定的二进制转换,这是一个例子:

  String s = "foo";
  byte[] bytes = s.getBytes();
  StringBuilder binary = new StringBuilder();
  for (byte b : bytes)
  {
     int val = b;
     for (int i = 0; i < 8; i++)
     {
        binary.append((val & 128) == 0 ? 0 : 1);
        val <<= 1;
     }
     binary.append(' ');
  }
  System.out.println("'" + s + "' to binary: " + binary);
Run Code Online (Sandbox Code Playgroud)

运行此示例将产生:

'foo' to binary: 01100110 01101111 01101111 
Run Code Online (Sandbox Code Playgroud)

  • 只需阅读维基百科http://en.wikipedia.org/wiki/Bitwise_operation即可.代码的作用是查看是否设置了最高位.如果是,则添加一个,否则添加零.然后我将原始数字上的所有位移到左侧,这意味着下一个最高位现在位于最高位的位置,下一个最高位位于下一个最高位等,并且前一个最高位消失.我再次测试是否设置了最高位(这最初是下一个最高位)并追加'0'或'1'.然后将位移动一步并执行相同的操作,直到您测试了所有位. (4认同)

Pet*_*rey 9

一个较短的例子

private static final Charset UTF_8 = Charset.forName("UTF-8");

String text = "Hello World!";
byte[] bytes = text.getBytes(UTF_8);
System.out.println("bytes= "+Arrays.toString(bytes));
System.out.println("text again= "+new String(bytes, UTF_8));
Run Code Online (Sandbox Code Playgroud)

版画

bytes= [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]
text again= Hello World!
Run Code Online (Sandbox Code Playgroud)


eri*_*son 6

StringJava中的A 可以用其getBytes(Charset)方法转换为"二进制" .

byte[] encoded = "????????!".getBytes(StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)

这种方法的论点是"字符编码"; 这是字符和字节序列之间的标准化映射.通常,每个字符都被编码为单个字节,但没有足够的唯一字节值来表示每种语言中的每个字符.其他编码使用多个字节,因此它们可以处理更广泛的字符.

通常,要使用的编码将由您正在实现的某些标准或协议指定.如果您正在创建自己的界面,并且可以自由选择,"UTF-8"是一种简单,安全且广泛支持的编码.

  • 这很简单,因为您可以默认使用UTF-8,而不是包含某些方法来记录每条消息的编码.
  • 它是安全的,因为UTF-8可以编码可以在Java字符串中使用的任何字符.
  • 它得到了广泛的支持,因为它是需要在任何Java实现中出现的少数几种字符编码之一,一直到J2ME.大多数其他平台也支持它,并且它在XML等标准中被用作默认值.

  • s.getBytes(“ UTF-8”)抛出UnsupportedEncodingException。因此,如果您使用的是getBytes(String encoding),则需要在try-catch前后加上转换。 (2认同)

Jay*_*emy 5

这是我的解决方案。它们的优点是:易于理解的代码,适用于所有字符。请享用。

解决方案1:

public static void main(String[] args) {

    String str = "CC%";
    String result = "";
    char[] messChar = str.toCharArray();

    for (int i = 0; i < messChar.length; i++) {
        result += Integer.toBinaryString(messChar[i]) + " ";
    }

    System.out.println(result);
}
Run Code Online (Sandbox Code Playgroud)

印刷品:

1000011 1000011 100101
Run Code Online (Sandbox Code Playgroud)

解决方案2:

可以选择每个字符的显示位数。

public static String toBinary(String str, int bits) {
    String result = "";
    String tmpStr;
    int tmpInt;
    char[] messChar = str.toCharArray();

    for (int i = 0; i < messChar.length; i++) {
        tmpStr = Integer.toBinaryString(messChar[i]);
        tmpInt = tmpStr.length();
        if(tmpInt != bits) {
            tmpInt = bits - tmpInt;
            if (tmpInt == bits) {
                result += tmpStr;
            } else if (tmpInt > 0) {
                for (int j = 0; j < tmpInt; j++) {
                    result += "0";
                }
                result += tmpStr;
            } else {
                System.err.println("argument 'bits' is too small");
            }
        } else {
            result += tmpStr;
        }
        result += " "; // separator
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)
public static void main(String args[]) {
    System.out.println(toBinary("CC%", 8));
}
Run Code Online (Sandbox Code Playgroud)

印刷品:

01000011 01000011 00100101
Run Code Online (Sandbox Code Playgroud)