字符串到BCD(embarcadero delphi)

时间:2013-05-31 15:14:54

标签: delphi bcd

编辑:

我在ascii中有(ascii中的测试文件)以下记录:“000000000.00”
我需要在解析它在BCD中的计数器部分(bcd / ebcdic中的另一个测试文件)时输出ISO。
我相信在BCD中需要6个字符,在ascii中需要11个。
所以我的需要是能够来回转换它的东西 首先,我想到了每个字符,将它转换为转换函数并将其转换回来,因此我的混乱问题。

我希望我更清楚。

Yain

3 个答案:

答案 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)

正如您所知,数字09的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