我现在有一个整数数组,想把它转变成二进制存入interbase数据库的一个blob字段并能还原读出来,但我发现存入也读出来的数据不一致,不知怎么回事?我的代码如下:
   存入       If dwBackupNumber = 10 then
          BEGIN
            Finger := '';
            for i := 0 to 458 do
              begin
                if Finger <> '' then Finger := Finger + ' ';
                Finger := Finger + IntToHex(dwEnrollData[i], 8);
              end;
          END;
       with dm1.fingerdata do
       begin
       EDIT;
       Append;
       Finger1 := TBlobStream.Create(TBlobField(DM1.Fingerdata.FieldByName('Finger_Data')), bmReadWrite);
       with twriter.Create(Finger1, Length(Finger)) do
       begin
         try
            Finger1.Write(PCHAR(Finger), Length(Finger));
         finally
            free;
         end;
       end;
          try
            Post;
            Close;
            OPen;
          except
            Exit;
          end;
       END;
     end ;
  
  读取
             begin
             FingerData := TBlobStream.Create(TBlobField(dm1.otherquery.FieldByName('Finger_Data')), bmread);
                  try
                     MemSize := FingerData.Size;
                     Inc(MemSize);
                     Features := AllocMem(MemSize);
                    try
                     FingerData.Read(Features^, MemSize);
                     Memo1.SetTextBuf(Features);
                    finally
                     FreeMem(Features, MemSize);                    end;
                  finally
                     FingerData.free;
                  end;

解决方案 »

  1.   

    const MinBase = 2; 
          MaxBase = 36; 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; 从字符串转换回数: 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, ind, 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;