将一串十进制数字转换为 BCD 的算法
Algorithm to convert a String of decimal digits to 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”,但首先我必须将字符串解析为 BCD。
第一步是将字符串解析为 int,以便获得它的数值。然后,使用除法和模数得到各个数字,并使用移位和加法(或移位和或)将每对数字打包成一个字节。
或者,您可以将字符串的每个字符单独解析为一个 int,并避免使用除法和模数来获取数字,但我更愿意预先解析整个字符串,以便您立即发现是否字符串无效。 (如果您收到 NumberFormatException,或者如果该值小于 0 或大于 9999,则它无效。)
最后,一旦你组装了两个单独的字节,你就可以将它们放入 byte[2].
找一个实用程序 class 来为您做这件事。肯定有人为 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。
您可以使用以下内容:
//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, 16);
}
return binBcd;
}
您可以试试下面的代码:
public static byte[] hex2Bytes(String str) {
byte[] b = new byte[str.length() / 2];
int j = 0;
for (int i = 0; i < b.length; i++) {
char c0 = str.charAt(j++);
char c1 = str.charAt(j++);
b[i] = ((byte) (parse(c0) << 4 | parse(c1)));
}
return b;
}
我正在寻找一种将字符串转换为等效 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”,但首先我必须将字符串解析为 BCD。
第一步是将字符串解析为 int,以便获得它的数值。然后,使用除法和模数得到各个数字,并使用移位和加法(或移位和或)将每对数字打包成一个字节。
或者,您可以将字符串的每个字符单独解析为一个 int,并避免使用除法和模数来获取数字,但我更愿意预先解析整个字符串,以便您立即发现是否字符串无效。 (如果您收到 NumberFormatException,或者如果该值小于 0 或大于 9999,则它无效。)
最后,一旦你组装了两个单独的字节,你就可以将它们放入 byte[2].
找一个实用程序 class 来为您做这件事。肯定有人为 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。
您可以使用以下内容:
//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, 16);
}
return binBcd;
}
您可以试试下面的代码:
public static byte[] hex2Bytes(String str) {
byte[] b = new byte[str.length() / 2];
int j = 0;
for (int i = 0; i < b.length; i++) {
char c0 = str.charAt(j++);
char c1 = str.charAt(j++);
b[i] = ((byte) (parse(c0) << 4 | parse(c1)));
}
return b;
}