{strtol()会将nptr指向的字符串,根据参数base,按权转化为long int, 然后返回这个值。
参数base的范围为2~36,和0;它决定了字符串以被转换为整数的权值。
可以被转换的合法字符依据base而定,举例来说,当base为2时,合法字符为‘0’,‘1’;
base为8时,合法字符为‘0’,‘1’,……‘7’;
base为10时,合法字符为‘0’,‘1’,……‘9’;
base为16时,合法字符为‘0’,‘1’,……‘9’,‘a’,……‘f’;
base为24时,合法字符为‘0’,……‘9’,‘a’,……‘n’,
base为36时,合法字符为‘0’,……‘9’,‘a’,……‘z’;等等。
其中,不区分大小写,比如,‘A’和‘a’会都会被转化为10。
当字符合法时,‘0’,……‘9’依次被转换为十进制的0~9,‘a’,……‘z’依次被转换为十进制的
10~35。
strtol()函数检测到第一个非法字符时,立即停止检测,其后的所有字符都会被当作非法
字符处理。合法字符串会被转换为long int, 作为函数的返回值。非法字符串,
即从第一个非法字符的地址,被赋给*endptr。**endptr是个双重指针,即指针的指针。
strtol()函数就是通过它改变*endptr的值,即把第一个非法字符的地址传给endptr。
多数情况下,endptr设置为NULL, 即不返回非法字符串。}
function strtol(var nptr: PChar; out endptr :PPChar; b: integer):long;
var
s, s1: PChar;
acc: LONG;
base, n, sign, valid: Integer;
cutoff: ULONG;
ch: Char;
function IsSpace(Ch: Char): Boolean; inline;
begin
Result := (Ch = #32) or (Ch = #$00A0); // Unicode non-breaking space
end;
Function IsDigit( ch:Char ): Boolean; inline;
Begin
Result := ch In ['0'..'9'];
End;
Function IsAlpha( ch:Char ): Boolean; inline;
begin
Result := ch in ['a'..'z', 'A'..'Z']
end;
Function IsUpper( ch:Char ): Boolean; inline;
begin
Result := ch in ['A'..'Z']
end;
Function IsAscii( ch:Char ): Boolean; inline;
begin
if (Ord(ch) >=0) and (Ord(ch)<=127) then
Result := True
else
Result := False;
end;
begin
base := b;
n := 0;
sign := 1;
valid := 1;
s := nptr;
if s^ = '-' then
sign := (-1)
else
sign := 1;
if (s^ = '+') or (s^ = '-') then
Inc(s);
if b = 0 then
begin
if (StrLComp(s, '0x', 2) = 0) or
(StrLComp(s, '0X', 2) = 0) then
begin
s := s + 2;
base := 16;
end
else
if ( s^ = '0') then
base := 8;
end;
while (IsAscii(s^)) and (valid > 0) do
begin
case s^ of
'0'..'7':
begin
n := base * n + Ord(s^) - Ord('0');
end;
'8'..'9':
begin
if base > 8 then
n := base * n + Ord(s^) - Ord('0')
else
valid := 0;
end;
'a'..'f':
begin
if base = 16 then
n := base * n + Ord(s^) - Ord('a') + 10
else
valid := 0;
end;
'A'..'F':
begin
if base = 16 then
n := base * n + Ord(s^) - Ord('A') + 10
else
valid := 0;
end;
else
begin
valid := 0;
end;
end;
Inc(s);
end;
if endptr^ <> nil then
endptr^ := s - 1;
Exit(sign * n);
end;
测试程序
program c2pas_demo;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
MyFunc in '..\live555-delphi\MyFunc.pas';
var
buffer :pChar;
stop: ppchar;
begin
buffer := '10379cend$3';//'000123456string';
GetMem(stop, Length(buffer));
stop^ := '';
try
Writeln('%d' + #10, strtol(buffer, stop, 16));
Writeln('%s' + #10, stop^);
//输出结果:
//17005006
//nd$3
Writeln('%d' + #10, strtol(buffer, stop, 10));
Writeln('%s' + #10, stop^);
{输出结果:
10379
cend$3
}
Writeln('%d' + #10, strtol(buffer, stop, 8));
Writeln('%s' + #10, stop^);
{输出结果:
543
9cend$3
}
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
FreeMem(stop);
end.