2013-05-31 70 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