关于BCD码 ( 积分: 300 )

  • 主题发起人 主题发起人 hgood
  • 开始时间 开始时间
H

hgood

Unregistered / Unconfirmed
GUEST, unregistred user!
最近在做电话计费系统,交换机是中兴公司的。在接收到的数据上遇到了难题,有知道的仁
兄帮帮手。问题如下:
这是我接收到的被叫号码数据(BCD码)
19 73 55 86 87 67 0F 00 00 00 00 00 00 00 00 00 00 00 01 5E
共20字节,其中 19 73 55 86 87 67 0F为被叫,0F是结束符,0F以后的数据其它作用。不用管它。我问了他们技术人员,他们解释说这个被叫是:9 137 55 68 78 76,
9可以不用理,就是要打长途,先按个9,
现在是怎么把 19 73 55 86 87 67 把转换成9 137 55 68 78 76
什么BCD码,反码,补码?想得我都头痛。
 
procedure Transfer(DataPtr:PByte);
var
i:Integer;
b:Byte;
begin
for i:=0 to 5do
begin
b:=DataPtr^;
DataPtr^:=(b shr 4) or (b shl 4);
Inc(DataPtr);
end;
//此时已经变成 91 37 55 68 78 76 0F .....
end;
function GetNumStr(Ptr:PByte):String;
var
i:Integer;
begin
Result:='';
for i:=0 to 5do
begin
Result:=Result+IntToHex(Ptr^,2);
if i<>5 then
Result:=Result+' ';
Inc(Ptr);
end;
//此时变成 '91 37 55 68 78 76'
Result[3]:=Result[2];
//将1后移一位
Result[2]:=' ';
end;

ps: BCD码好像就是用一个Byte的前后各4位存放两个十进制数字的编码方式。
 
to:creation-zy,谢了。明天我试试。
 
to creation-zy兄:
还是不对啊
procedure TForm4.Button4Click(Sender: TObject);
const
bb:array[0..5] of byte=(19,73,55,86,87,67);
begin
showMessage(GetNumStr(@bb));
end;
结果是:
1 349 37 56 57 43
上面的算法只是把它们转换成16进制的。没有达到效果喔。
 
谢谢!搞定
 
后退
顶部