编辑:
我在ascii中有(ascii中的测试文件)以下记录:“000000000.00”
我需要在解析它在BCD中的计数器部分(bcd / ebcdic中的另一个测试文件)时输出ISO。
我相信在BCD中需要6个字符,在ascii中需要11个。
所以我的需要是能够来回转换它的东西
首先,我想到了每个字符,将它转换为转换函数并将其转换回来,因此我的混乱问题。
我希望我更清楚。
Yain
答案 0 :(得分:3)
博士。 Peter Below(Team B)几年前在旧的Borland Delphi新闻组中捐赠了这些:
// NO NEGATIVE NUMBERS either direction.
// BCD to Integer
function BCDToInteger(Value: Integer): Integer;
begin
Result := (Value and $F);
Result := Result + (((Value shr 4) and $F) * 10);
Result := Result + (((Value shr 8) and $F) * 100);
Result := Result + (((Value shr 16) and $F) * 1000);
end;
// Integer to BCD
function IntegerToBCD(Value: Integer): Integer;
begin
Result := Value div 1000 mod 10;
Result := (Result shl 4) or Value div 100 mod 10;
Result := (Result shl 4) or Value div 10 mod 10;
Result := (Result shl 4) or Value mod 10;
end;
答案 1 :(得分:0)
正如您所知,数字0
到9
的ASCII码是48到57.因此,如果您依次将每个字符转换为其ASCII等效值并减去48,那么您将得到它数值。然后乘以10,然后添加下一个数字。在伪代码中(对不起,不是delphi人):
def bcdToInt( string ):
val = 0
for each ch in string:
val = 10 * val + ascii(ch) - 48;
return val;
如果你的“字符串”实际上包含“真正的BCD值”(即0到9之间的数字,而不是它们的ASCII等价48到57),那么不要在上面的代码中减去48。最后,如果将两个BCD值隐藏在一个字节中,则可以使用0x0F
(15)按位AND访问连续成员。但在这种情况下,Ken White的解决方案显然更有帮助。我希望这足以让你前进。
答案 2 :(得分:0)
以下函数适用于8位十六进制和BCD值。
function BCDToInteger(Value: DWORD): Integer;
const Multipliers:array[1..8] of Integer=(1, 10, 100, 1000, 10000, 100000, 1000000, 10000000);
var j:Integer;
begin
Result:=0;
for j:=1 to 8 do //8 digits
Result:=Result+(((Value shr ((j-1)*4)) and $0F) * Multipliers[j]);
end;//BCDToInteger
function IntegerToBCD(Value: DWORD): Integer;
const Dividers:array[1..8] of Integer=(1, 10, 100, 1000, 10000, 100000, 1000000, 10000000);
var j:Integer;
begin
Result:=0;
for j:=8 downto 1 do //8 digits
Result:=(Result shl 4) or ((Value div Dividers[j]) mod 10);
end;//IntegerToBCD