Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将十进制数字字符串转换为BCD的算法_Java_Arrays_String_Bcd - Fatal编程技术网

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

Java 将十进制数字字符串转换为BCD的算法,java,arrays,string,bcd,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

我正在寻找一种将字符串转换为等效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中(根据本页:):


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

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

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


最后,组装好两个单独的字节后,可以将它们放入
字节[2]中。

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

给你。我在谷歌上搜索了“BCD Java”并得到了它。正在复制代码以供将来参考

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();
    }
}
公共类BCD{
/*
*bcd字节数组的长数字,例如123-->(0000)0001 0010 0011
*例如,12--->0001 0010
*/
公共静态字节[]DecToBCDArray(长num){
整数位数=0;
长温度=num;
while(温度!=0){
数字++;
温度/=10;
}
int byteLen=数字%2==0?数字/2:(数字+1)/2;
布尔isOdd=位数%2!=0;
字节bcd[]=新字节[byteLen];
对于(int i=0;i>=(字节)4;
高=(字节)(高&0x0f);
字节低=(字节)(bcd和0x0f);
某人(高);
某人(低);
使某人返回字符串();
}
公共静态字符串BCDtoString(字节[]bcd){
StringBuffer sb=新的StringBuffer();
对于(int i=0;i
还有一个问题:。

您可以使用以下选项:

//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;
}
//将BCD字符串转换为字节数组
公共静态字节[]String2Bcd(java.lang.String bcdString){
byte[]binBcd=新字节[bcdString.length()/2];
对于(int i=0;i
每个字节有两个BCD数字。一个在上面的4位,一个在下面的4位。因此,使用BCD时,四个十进制数字正好适合两个字节。@genisage字符串只有0到9之间的数字。提示:您需要使用按位运算符,如shift和or。@markspace是的,但如何将这四个BCD数字保存到一个字节[2]?将其分解为更小的部分。如何将两个数字放入一个字节,以及如何将两个字节放入一个
字节[2].
谢谢你的回答@gknicker,但更进一步地说,我试图理解的代码是我必须做的。哈哈,我很高兴我被遗忘已久的gist片段已经悄悄地出现了。为了方便起见,我在gist文件中添加了一个主要的测试方法来回应注释。如果我提供的位数为t 3或5或7,如果数字除以2,则效果良好。是否需要前导零?为什么?是否有一种版本可以生成BCD字节数组而不带前导零,而不管输入是3位还是4位?
//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;
}