Java - 将ASCII转换为二进制而不带前导零

时间:2015-08-05 20:38:31

标签: java binary byte ascii

我正在使用此代码:

    byte[] bytes = MESSAGE.getBytes();
    StringBuilder str = new StringBuilder();
    for (byte b : bytes) {
        int val = b;
        for (int i = 0; i < 8; i++) {
            str.append((val & 128) == 0 ? 0 : 1);
            val <<= 1;
        }
    }

我尝试修改它以从每个ASCII字符的二进制代码中删除前导零,然后将其附加到二进制StringBuilder str。但问题是前导零的数量是未知的,我只能通过在第一个块之后添加以下内容从整个二进制块中删除它们:

    String MSG = "";
    for(int i = 0; i < str.length(); i++) {
        if(str.charAt(i) == '0')
            MSG = (str.toString()).substring(i+1,str.length());
        else
            break;
    }

有什么想法吗?

5 个答案:

答案 0 :(得分:4)

Integer.toBinaryString(yourByte).replaceFirst(&#34; 0 *&#34;,&#34;&#34;);

更完整的例子是。

final StringBuilder builder = new StringBuilder();
String example = "A test string";

for( byte b: example.getBytes()){
    builder.append(Integer.toBinaryString(b).replaceFirst("0*",""));
}   

System.out.println(builder.toString());

答案 1 :(得分:3)

这个怎么样:

byte[] bytes = MESSAGE.getBytes();
StringBuilder str = new StringBuilder();
for (byte b : bytes) {
    int val = b;
    boolean dontWriteYet = true;
    for (int i = 0; i < 8; i++) {
        int digit = (val & 128) == 0 ? 0 : 1;
        if(digit == 1 && dontWriteYet ) {
            dontWriteYet = false;
        } 
        if (!dontWriteYet) {
            str.append(digit);
        }
        val <<= 1;
    }
    //if all 0's then we must add the 0
    if (dontWriteYet){
        str.append(0);
    }
}

基本上不要写入str,直到你得到1.一旦你得到1,然后写下其余的。

用EDITTED代码添加所有0的情况。

答案 2 :(得分:2)

它确实看起来很复杂,因为你使用了三元运算符,但实际上并没有那么难以修改代码来省略前导零:

byte[] bytes = MESSAGE.getBytes();
StringBuilder str = new StringBuilder();
boolean first = true;
for (byte b : bytes) {
    int val = b;
    for (int i = 0; i < 8; i++) {
        int v = (val & 128) == 0 ? 0 : 1;
        if (v == 1 || !first || i == 7) {
            str.append(v);
            first = false;
        }
        val <<= 1;
    }
}

答案 3 :(得分:1)

最简单的解决方案是在找到1时使用标记进行标记,并在此类标志为true时仅添加字符。这个解决方案有一个不方便,你必须每次检查那个标志。更有效的解决方案是使用不同的代码来遍历零和添加字符:

static class Indexes {

    int indexByte;
    int indexBit;
}

static void traverseZeroes(byte[] bytes, Indexes indexes) {
    for (indexes.indexByte = 0; indexes.indexByte < bytes.length; ++indexes.indexByte) {
        int val = bytes[indexes.indexByte];
        for (indexes.indexBit = 0; indexes.indexBit < 8; ++indexes.indexBit) {
            if ((val & 128) != 0) {
                return;
            }
            val <<= 1;
        }
    }
}

static void addBits(byte[] bytes, Indexes indexes, StringBuilder str) {
    if ( indexes.indexByte>=bytes.length ) {
        str.append('0');
        return;
    }
    int val = bytes[indexes.indexByte] << indexes.indexBit;
    for (;;) {
        while (indexes.indexBit < 8) {
            str.append((val & 128) == 0 ? 0 : 1);
            val <<= 1;
            ++indexes.indexBit;
        }
        indexes.indexBit = 0;
        ++indexes.indexByte;
        if (indexes.indexByte >= bytes.length) {
            break;
        }
        val = bytes[indexes.indexByte];
    }
}

public static void main(String[] args) {
    byte[] bytes = MESSAGE.getBytes();
    StringBuilder str = new StringBuilder();
    Indexes indexes = new Indexes();
    traverseZeroes(bytes, indexes);
    addBits(bytes, indexes, str);
    System.out.println(str);
}

在不太可能的情况下,性能足够重要使用它。否则使用旗帜。

答案 4 :(得分:0)

您可以将ASCII代码作为Integer开始,然后在其上调用.toBinaryString()吗?我认为这将摆脱零。 Docs are here if it helps.

要获得Integer值,您可以直接从角色投射。

public String characterToBinary(char c){
    int ascii = (int) c;
    return Integer.toBinaryString(ascii);
}

如果它是Integer,您还可以访问其他有用的方法,例如.numberOfLeadingZeros()