Delphi版本的strtol

{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.

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值