2010-01-20 59 views
1

德爾福相當於C utoa函數,這使我提供一個基數?我使用的是Delphi 2007,並且必須讀取一個使用utoa的基數爲32的文件。我寧願不重新發明輪子並介紹我自己的錯誤。它將以與IntToStr操作相同的方式運行,該操作使用基數10,因此IntToStr的等效utoa將爲utoa(值10);德爾福相當於從C

作爲示例,整數100應該返回值「34」。

+0

如果基數是32,那麼生成「32」的正確輸入是不是10? (32的立方根是一個比pi略高的無理數。) – 2010-01-20 15:16:00

+0

@mason,是 - 修正了問題。 – mj2008 2010-01-20 15:20:22

+2

你鏈接的文檔說utoa只支持10,8,16字節。基本32將使用哪些字符? – Jacob 2010-01-20 15:24:42

回答

3

嗯,我做了我的舊代碼的搜索,並發現這似乎工作!

function ItoA(value : Cardinal; Radix : Cardinal) : string; 
const 
    acCharRef : array [0 .. 35] of char 
    = (
    '0', '1', '2', '3', '4', '5', '6', '7', 
    '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 
    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 
    'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 
    'W', 'X', 'Y', 'Z' 
); 
var 
    nIndex : Integer; 
    szBuild : string; 
begin 
     {* Now loop, taking each digit as modulo radix, and reducing the value 
     * by dividing by radix, until the value is zeroed. Note that 
     * at least one loop occurs even if the value begins as 0, 
     * since we want "0" to be generated rather than "". 
     *} 
    szBuild := ''; 

    repeat 
    nIndex := value mod radix; 
    szBuild := acCharRef[nIndex] + szBuild; 
    value := value div radix; 
    until value = 0; 

    result := szBuild; 
end; 
+4

非常好,雖然你可能想要在頂部檢查或斷言,以確保基數不是> 35. – 2010-01-20 15:34:18

+0

同意瓦特/梅森。頂部的一個簡單的襯墊可以確保安全: 斷言(基數> = 0和基數<36); 或甚至更好以允許將來擴展到未知基數: 斷言(基數> =低(acCharRef)和基數<=高(acCharRef)); – 2010-01-21 14:45:24