BCDとは †
- 二進化十進数、Binary-coded decimal
- 2進数 で 10進数を表す方法
パック 10 進 †
- +1234
0000 0001 | 0010 0011 | 0100 1100 |
0 1 | 2 3 | 4 + |
- -1234
0000 0001 | 0010 0011 | 0100 1101 |
0 1 | 2 3 | 4 - |
- 4 bit で、10進 1桁を表す
- 末尾 4 bitが符号。 + : 12(1100)、- : 13(1101)
- 最上位 4bit に相当する 10 進数の桁が無い場合には 0 にする。
ゾーン 10 進 (=アンパック 10 進) †
- ASCII なり EBCDIC の文字で 10 進数を表す
- ASCII
0x30 | 0x31 | 0x32 | 0x33 | 0x34 | 0x35 | 0x36 | 0x37 | 0x38 | 0x39 | 0x3A | 0x3B | 0x3C | 0x3D | 0x3E | 0x3F |
'0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | ';' | ':' | '<' | '=' | '>' | '?' |
- EBCDIC
0xF0 | 0xF1 | 0xF2 | 0xF3 | 0xF4 | 0xf5 | 0xF6 | 0xF7 | 0xF8 | 0xF9 | 0xFA | 0xFB | 0xFC | 0xFD | 0xFE | 0xFF |
'0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | | | | | | |
- 上位 4 bit をゾーンビットと呼ぶ
- 最下位桁のゾーンビットに符号を入れる + : 12(1100)、- : 13(1101) 。符号にどの値を使うかには方言がある
- +1234
- EBCDIC
1111 0001 | 1111 0010 | 1111 0011 | 1100 0100 |
f 1 | f 2 | f 3 | + 4 |
- ASCII
0011 0001 | 0011 0010 | 0011 0011 | 1100 0100 |
3 1 | 3 2 | 3 3 | + 4 |
- -1234
- EBCDIC
1111 0001 | 1111 0010 | 1111 0011 | 1101 0100 |
f 1 | f 2 | f 3 | - 4 |
- ASCII
0011 0001 | 0011 0010 | 0011 0011 | 1101 0100 |
3 1 | 3 2 | 3 3 | - 4 |
パック 10 進変換プログラム †
変換テーブルを使うと吉
package com.snail.exam.javaexam;
import java.io.ByteArrayOutputStream;
import sun.misc.HexDumpEncoder;
public class BCDUtil {
public static final int[] BCD2INT = new int[]{
0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,
10,11,12,13,14,15,16,17,18,19,0,0,1,1,0,0,
20,21,22,23,24,25,26,27,28,29,0,0,2,2,0,0,
30,31,32,33,34,35,36,37,38,39,0,0,3,3,0,0,
40,41,42,43,44,45,46,47,48,49,0,0,4,4,0,0,
50,51,52,53,54,55,56,57,58,59,0,0,5,5,0,0,
60,61,62,63,64,65,66,67,68,69,0,0,6,6,0,0,
70,71,72,73,74,75,76,77,78,79,0,0,7,7,0,0,
80,81,82,83,84,85,86,87,88,89,0,0,8,8,0,0,
90,91,92,93,94,95,96,97,98,99,0,0,9,9,0,0,
};
public static final byte[] INT2BCD = new byte[]{
(byte)0x0,(byte)0x1,(byte)0x2,(byte)0x3,(byte)0x4,
(byte)0x5,(byte)0x6,(byte)0x7,(byte)0x8,(byte)0x9,
(byte)0x10,(byte)0x11,(byte)0x12,(byte)0x13,(byte)0x14,
(byte)0x15,(byte)0x16,(byte)0x17,(byte)0x18,(byte)0x19,
(byte)0x20,(byte)0x21,(byte)0x22,(byte)0x23,(byte)0x24,
(byte)0x25,(byte)0x26,(byte)0x27,(byte)0x28,(byte)0x29,
(byte)0x30,(byte)0x31,(byte)0x32,(byte)0x33,(byte)0x34,
(byte)0x35,(byte)0x36,(byte)0x37,(byte)0x38,(byte)0x39,
(byte)0x40,(byte)0x41,(byte)0x42,(byte)0x43,(byte)0x44,
(byte)0x45,(byte)0x46,(byte)0x47,(byte)0x48,(byte)0x49,
(byte)0x50,(byte)0x51,(byte)0x52,(byte)0x53,(byte)0x54,
(byte)0x55,(byte)0x56,(byte)0x57,(byte)0x58,(byte)0x59,
(byte)0x60,(byte)0x61,(byte)0x62,(byte)0x63,(byte)0x64,
(byte)0x65,(byte)0x66,(byte)0x67,(byte)0x68,(byte)0x69,
(byte)0x70,(byte)0x71,(byte)0x72,(byte)0x73,(byte)0x74,
(byte)0x75,(byte)0x76,(byte)0x77,(byte)0x78,(byte)0x79,
(byte)0x80,(byte)0x81,(byte)0x82,(byte)0x83,(byte)0x84,
(byte)0x85,(byte)0x86,(byte)0x87,(byte)0x88,(byte)0x89,
(byte)0x90,(byte)0x91,(byte)0x92,(byte)0x93,(byte)0x94,
(byte)0x95,(byte)0x96,(byte)0x97,(byte)0x98,(byte)0x99
};
public static void main(String[] args) {
System.out.println(bcd2int(new byte[]{0x01,0x23,0x4c}));
System.out.println(bcd2int(new byte[]{0x01,0x23,0x4d}));
HexDumpEncoder hex = new HexDumpEncoder();
System.out.println(hex.encode(int2bcd(1234)));
System.out.println(hex.encode(int2bcd(-1234)));
}
public static int bcd2int(byte[] bcd){
int p = 0;
int cnt;
for (cnt = 0; cnt < (bcd.length - 1); cnt++) {
p = p * 100 + BCD2INT[bcd[cnt]];
}
p = (p * 10 + BCD2INT[bcd[cnt]]) * ((bcd[cnt] & 0x0f) == 13 ? -1 : 1);
return p;
}
public static byte[] int2bcd(int intNum){
int p = intNum;
ByteArrayOutputStream bout = new ByteArrayOutputStream();
if (p < 0) {
p = p * -1;
bout.write((p % 10) * 16 + 13);
} else {
bout.write((p % 10) * 16 + 12);
}
p = p / 10;
while (p > 0) {
bout.write(INT2BCD[p % 100]);
p = p / 100;
}
return reverse(bout.toByteArray());
}
public static byte[] reverse(byte[] src) {
int left = 0;
int right = src.length - 1;
byte tmp;
while(left < right) {
tmp = src[right];
src[right] = src[left];
src[left] = tmp;
left += 1;
right -= 1;
}
return src;
}
}
実行結果
1234
-1234
0000: 01 23 4C
0000: 01 23 4D
Java#JavaSE