誰知道:16进制相加的函數﹐以及16進制轉換成字符串的函數

解决方案 »

  1.   

    十六进制的数据,如果不是字符形式直接相加不就行了,如果是字符串形势,先转换再相加,下面是两个相关的函数,看看对你有用吗?function StrToNum (const s: string; base: Integer;
                       neg: Boolean; max: Integer): Integer;
    // s = 要转换的字符串
    // base = 源字符串进制数
    // neg = 是否为负数// max = 要转换的最大数//
    // 用法:
    // i:= StrToNum (''00101101'', 2, false, MaxInt);
    // i:= StrToNum (''002D'', 16, false, MaxInt);
    // i:= StrToNum (''-45'', 10, true, MaxInt);
    // i:= StrToNum (''ZZ'', 36, true, MaxInt);
    //
    var
      negate, done: Boolean;
      i, len, digit, mmb: Integer;
      c: Char;
      mdb, res: Integer;
    begin
      res:= 0;  i:= 1;  digit:= 0;
      if (base >= MinBase) and (base <= MaxBase) then
      begin
        mmb:= max mod base;
        mdb:= max div base;
        len:= Length (s);
        negate:= False;
        while (i <= len) and (s[i] = ' ') do Inc (i);
        if neg then
        begin
          case s[i] of
            '+': Inc (i);
            '-': begin  Inc (i);  negate:= TRUE; end;
          end; (* CASE *)
        end; (* IF neg *)
        done:= len > i;
        while (i <= len) and done do
        begin
          c:= Upcase (s[i]);
          case c of
            '0'..'9': digit:= ORD(c) - 48;
            'A'..'Z': digit:= ORD(c) - 55;
            else
              done:= FALSE
          end; (* CASE *)
          done:= done and (digit < base);
          if done then
          begin
            done:= (res < mdb) or ((res = mdb) and (digit <= mmb));
            IF done then
            begin
              res:= res * base + digit;
              Inc (i);
            end; (* IF done *)
          end; (* IF done *)
        end; (* WHILE *)
        if negate then res:= - res;
      end; (* IF done *)
      Result:= res;
    end;
    function NumToStr (num, len, base: Integer; neg: Boolean;
                      fill: char): string;
    // num =  要转换的数
    // len =  生成字符串的最小长度// base = 目标数的进制数 2 = 二进制
    // neg =  是否允许负数// fill = 填充字符用于补满字符串长度//
    // 用法:
    // NumToStr (45, 8, 2, false, ''0'') > ''00101101''
    // NumToStr (45, 4, 8, false, ''0'') > ''0055''
    // NumToStr (45, 4, 10, false, '' '') > ''  45''
    // NumToStr (45, 4, 16, false, ''0'') > ''002D''
    // NumToStr (45, 0, 36, false, '' '') > ''19''
    //
    var
      s: string;
      digit: Integer;
    begin
      num:= ABS (num);
      if ((base >= MinBase) and (base <= MaxBase)) then
      begin
        s:= '';
        repeat
          digit:= num mod base;
          if digit < 10 then
            Insert (CHR (digit + 48), s, 1)
          else
            Insert (CHR (digit + 55), s, 1);
          num:= num div base;
        until num = 0;
        if neg then  Insert ('-', s, 1);
        while Length(s) < len do Insert (fill, s, 1);
      end;
      Result:= s;
    end;
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      i: integer;
    begin
      i:= $10 + $10;//可以直接向加
      showmessage(inttostr(i));
      showmessage(inttohex(i, 2));
    end;其中inttohex就是16進制轉換成字符串的函數,后面的参数2表示字符串的长度。
      

  3.   

    IntToHex($de,8);
    StrToInt('$de');
      

  4.   

    var
      Str: String;
      Count: Integer;
    begin// 十六进制 $22 转换为字符串
      FmtStr(Str, '%.5x', [$22]);
      ShowMessage(Str);
      FmtStr(t, '%.*x', [5,$22]);
      ShowMessage(Str);
      IntToHex($22, 5);
      ShowMessage(Str);
    //
    //16 进制数相加
      FmtStr(t, '%.*x', [5,$22+$35]);
      ShowMessage(Str);
    //
    //16 进制字符串相加
      Count := StrToIntDef('$'+'0F', 0) + StrToIntDef('$'+'36', 0);
      FmtStr(t, '%.*x', [5,$22]);
      ShowMessage(Str);
    //
    end;
      

  5.   

    var
      Str: String;
      Count: Integer;
    begin// 十六进制 $22 转换为字符串
      FmtStr(Str, '%.5x', [$22]);
      ShowMessage(Str);
      FmtStr(t, '%.*x', [5,$22]);
      ShowMessage(Str);
      IntToHex($22, 5);
      ShowMessage(Str);
    //
    //16 进制数相加
      FmtStr(t, '%.*x', [5,$22+$35]);
      ShowMessage(Str);
    //
    //16 进制字符串相加
      Count := StrToIntDef('$'+'0F', 0) + StrToIntDef('$'+'36', 0);
      FmtStr(t, '%.*x', [5,$22]);
      ShowMessage(Str);
    //
    end;
      

  6.   

    //最近我也在用数据相加,至于转换为字符串可以就麻烦一点了function up(FirstFile:string):integer;
    var
       handle1:integer;
       len1:integer;
       iRead: Integer;
       buffer:pchar;
       i,s1,s2:integer;
    begin
       up:=0;
       Handle1 := FileOpen(FirstFile, fmOpenRead); //文件读入内存,
       Len1:= FileSeek(Handle1,0,2);
       FileSeek(Handle1,0,0);
       Buffer := Pchar(AllocMem(Len1 + 1));
       iRead := FileRead(Handle1, Buffer^, Len1);
       FileClose(Handle1);
       try
        for i:=0 to iRead-1 do         //取数据直接用buffer[i]计算就是16进制
          if ord(buffer[i])=0 then
           begin
            s1:=ord(buffer[i+1]);       //去件转整计算的如果要写入用filewrite
            s2:=ord(buffer[i+2]);
            if s1<s2 then
              begin
                 up:=i;
                 exit;
              end;
            end;  
        finally
          freemem(buffer);
        end;
    end;
    不知你的16進制轉換成字符串是将数字转换为字符串,还是要读文件里的数据如果是前边
    inttostr(ord(buffer[i+1]));如果是后面就不会了
      

  7.   

    +然后加法运算还分进制?晕~~~运算时,数都是一个,只在显示出来才有进制这概念转字符串IntToHex