我(在ASCII測試文件)以ASCII有如下記載:「000000000.00」
我需要它輸出ISO在解析它在BCD計數器部分(其他測試文件在bcd/ebcdic)。
我相信它需要6個字符的BCD和11個ASCII碼。
所以我的需求是可以來回轉換它的東西。
首先,我想每個字符,餵它轉換功能,並將其轉換回來,因此我搞砸了問題。
我希望我更清楚。
Yain
我(在ASCII測試文件)以ASCII有如下記載:「000000000.00」
我需要它輸出ISO在解析它在BCD計數器部分(其他測試文件在bcd/ebcdic)。
我相信它需要6個字符的BCD和11個ASCII碼。
所以我的需求是可以來回轉換它的東西。
首先,我想每個字符,餵它轉換功能,並將其轉換回來,因此我搞砸了問題。
我希望我更清楚。
Yain
彼得博士下面(的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;
很確定這是OP尋找的答案,而不是我的沉思... – Floris
爲什麼你會用這個而不是內置函數? –
我沒有,我沒有問這個問題。這個問題具體問到沒有內置函數的問題,我發佈了這個問題來回答這個問題(與現在有很大不同)。然後海報修改了這個問題,但沒有回答任何後續問題。現在看來這是解析問題,甚至在原始問題中沒有提及。我不知道這裏的實際問題是什麼,直到海報澄清它,我只是留下了答案。如果需要,我會刪除它。 –
正如你可能知道,通過數字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的解決方案顯然更有幫助。我希望這足以讓你走。
以下功能適用於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
等等...你的函數名是'bcdConvInt',但是你傳遞了一個'AnsiString'。你真的在尋找'BCDStringToInt'嗎?請編輯你的問題,以糾正標題或解釋你想要做什麼,因爲這兩個組合沒有意義。你爲什麼從文件中獲取BCD值並將其存儲在一個字符串中?這不是一個字符串。 –
你說得對。我對之前解決的ebcdic問題感到厭倦。 –
請再次編輯以提供您想要轉換的字符串樣本以及您期望轉換的值,因爲「(它以某種方式搞砸了我的分析」)告訴我您的分析錯誤。 'StrToBCD'和'BCDToStr'已經存在了一段時間,所以我懷疑這些功能是否存在問題。 –