2013-05-31 71 views
0

编辑:字符串BCD(Embarcadero的德尔福)

我(在ASCII测试文件)以ASCII有如下记载:“000000000.00”
我需要它输出ISO在解析它在BCD计数器部分(其他测试文件在bcd/ebcdic)。
我相信它需要6个字符的BCD和11个ASCII码。
所以我的需求是可以来回转换它的东西。
首先,我想每个字符,喂它转换功能,并将其转换回来,因此我搞砸了问题。

我希望我更清楚。

Yain

+0

等等...你的函数名是'bcdConvInt',但是你传递了一个'AnsiString'。你真的在寻找'BCDStringToInt'吗?请编辑你的问题,以纠正标题或解释你想要做什么,因为这两个组合没有意义。你为什么从文件中获取BCD值并将其存储在一个字符串中?这不是一个字符串。 –

+0

你说得对。我对之前解决的ebcdic问题感到厌倦。 –

+1

请再次编辑以提供您想要转换的字符串样本以及您期望转换的值,因为“(它以某种方式搞砸了我的分析”)告诉我您的分析错误。 'StrToBCD'和'BCDToStr'已经存在了一段时间,所以我怀疑这些功能是否存在问题。 –

回答

3

彼得博士下面(的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; 
+0

很确定这是OP寻找的答案,而不是我的沉思... – Floris

+0

为什么你会用这个而不是内置函数? –

+0

我没有,我没有问这个问题。这个问题具体问到没有内置函数的问题,我发布了这个问题来回答这个问题(与现在有很大不同)。然后海报修改了这个问题,但没有回答任何后续问题。现在看来这是解析问题,甚至在原始问题中没有提及。我不知道这里的实际问题是什么,直到海报澄清它,我只是留下了答案。如果需要,我会删除它。 –

0

正如你可能知道,通过数字0的ASCII码9是48到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。最后,如果将两个BCD值放入单个字节中,则可以使用0x0F(15)按位AND访问连续成员。但是在那种情况下,Ken White的解决方案显然更有帮助。我希望这足以让你走。

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