将十进制数字字符串转换为BCD的算法

时间:2015-01-21 22:01:19

标签: java arrays string bcd

我正在寻找将字符串转换为BCD等效的方法。我使用java,但它确实不是语言的问题。我试图逐步了解如何将字符串转换为BCD。

例如,假设我有以下字符串;

"0200" (This string has four ASCII characters, if we were in java this string had been contained in a byte[4] where byte[0] = 48, byte[1] = 50, byte[2] = 48 and byte[3] = 48)

在BCD中(根据本页:http://es.wikipedia.org/wiki/Decimal_codificado_en_binario):

0 = 0000
2 = 0010
0 = 0000
0 = 0000

好吧,我认为转换是正确的,但我必须将其保存在一个字节[2]中。我该怎么办?之后,我必须阅读BCD并将其转换为原始字符串" 0200"但首先我必须将String解析为BCD。

问候!

5 个答案:

答案 0 :(得分:5)

这张图片帮助我了解了我自己的例子。

enter image description here

答案 1 :(得分:2)

找一个实用程序类来为您执行此操作。当然有人为Java编写了BCD转换实用程序。

你走了。我用Google搜索“BCD Java”并得到this as the first result。在此处复制代码以供将来参考。

public class BCD {

    /*
     * long number to bcd byte array e.g. 123 --> (0000) 0001 0010 0011
     * e.g. 12 ---> 0001 0010
     */
    public static byte[] DecToBCDArray(long num) {
        int digits = 0;

        long temp = num;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }

        int byteLen = digits % 2 == 0 ? digits / 2 : (digits + 1) / 2;
        boolean isOdd = digits % 2 != 0;

        byte bcd[] = new byte[byteLen];

        for (int i = 0; i < digits; i++) {
            byte tmp = (byte) (num % 10);

            if (i == digits - 1 && isOdd)
                bcd[i / 2] = tmp;
            else if (i % 2 == 0)
                bcd[i / 2] = tmp;
            else {
                byte foo = (byte) (tmp << 4);
                bcd[i / 2] |= foo;
            }

            num /= 10;
        }

        for (int i = 0; i < byteLen / 2; i++) {
            byte tmp = bcd[i];
            bcd[i] = bcd[byteLen - i - 1];
            bcd[byteLen - i - 1] = tmp;
        }

        return bcd;
    }

    public static String BCDtoString(byte bcd) {
        StringBuffer sb = new StringBuffer();

        byte high = (byte) (bcd & 0xf0);
        high >>>= (byte) 4; 
        high = (byte) (high & 0x0f);
        byte low = (byte) (bcd & 0x0f);

        sb.append(high);
        sb.append(low);

        return sb.toString();
    }

    public static String BCDtoString(byte[] bcd) {

        StringBuffer sb = new StringBuffer();

        for (int i = 0; i < bcd.length; i++) {
            sb.append(BCDtoString(bcd[i]));
        }

        return sb.toString();
    }
}

还有这个问题:Java code or lib to decode a binary-coded decimal (BCD) from a String

答案 2 :(得分:1)

https://gist.github.com/neuro-sys/953548

neuro-sys / BCDConvert.java代码的链接

答案 3 :(得分:0)

第一步是将字符串解析为int,以便您拥有它的数值。然后,使用除法和模数得到各个数字,并使用shift和add(或shift和or)将每对数字打包成一个字节。

或者,您可以将字符串的每个字符分别解析为int,并避免使用除法和模数来获取数字,但我更倾向于预先解析整个字符串,以便您立即发现字符串是否为无效。 (如果您获得NumberFormatException,或者该值小于0或大于9999,则它无效。)

最后,一旦汇编了两个单独的字节,就可以将它们放入byte[2].

答案 4 :(得分:0)

您可以使用以下内容:

//Convert BCD String to byte array
public static byte[] String2Bcd(java.lang.String bcdString) {

    byte[] binBcd = new byte[bcdString.length() / 2];

    for (int i = 0; i < binBcd.length; i++) {
        String sByte = bcdString.substring(i*2, i*2+2);
        binBcd[i] = Byte.parseByte(sByte);
    }
    return binBcd;
}