0

编辑:

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

我希望我更清楚。

雅因

4

3 回答 3

3

几年前( B 组的) Peter 博士在旧的 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;
于 2013-05-31T15:17:57.787 回答
0

您可能知道,数字的 ASCII 代码0948 到 57。因此,如果您将每个字符依次转换为其 ASCII 等效值并减去 48,您就得到了它的数值。然后你乘以十,然后加上下一个数字。在伪代码中(对不起,不是德尔福人):

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。0x0F最后,如果将两个 BCD 值放入一个字节中,您将使用(15)的按位与访问连续成员。但在这种情况下,Ken White 的解决方案显然更有帮助。我希望这足以让你继续前进。

于 2013-05-31T15:24:05.440 回答
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
于 2015-11-02T11:40:59.170 回答