原函数如下:
function StreamToHexStr(AStream: TStream): String;
const
  HexChars: array[0..15] of Char = '0123456789ABCDEF';
var
  i,len: Integer;
begin
  len := AStream.Size - AStream.Position;
  SetLength(Result, len * 2);
  AStream.Read(Pointer(Result)^, len);
  for i := len downto 1 do begin
    Result[i * 2]    := HexChars[Byte(Result[i]) and $0F];
    Result[i * 2 -1] := HexChars[(Byte(Result[i]) and $F0) shr 4]
  end;
end;求“反”函数
function HexStrToStream(AHexStr: String): TStream;

解决方案 »

  1.   

    TStream不要当返回值,而是通过参数传进来。
    function HexStrToStream(AHexStr: String;AStream: TStream):Boolean;
    var
      iLen: Integer;
      Buff: String;
      P1,P2: PChar;
      B: Byte;
    begin
      Result := False;
      if Not Assigned(AStream) then Exit;
      iLen := Length(AHexStr);
      if iLen = 0 then Exit;
      if (iLen mod 2) <> 0 then Exit;
      SetString(Buff,Nil,iLen div 2);
      P1 := PChar(AHexStr);
      P2 := PChar(Buff);
      while iLen > 0 do begin
        if P1^ in ['0'..'9'] then
          B := Ord(P1^) - Ord('0')
        else if P1^ in ['A'..'F'] then
          B := Ord(P1^) - Ord('A') + 10
        else if P1^ in ['a','f'] then 
          B := Ord(P1^) - Ord('a') + 10
        else 
          Exit;    
        B := B shl 4;
        Inc(P1);
        Dec(iLen);
        if P1^ in ['0'..'9'] then
          B := B + Ord(P1^) - Ord('0')
        else if P1^ in ['A'..'F'] then
          B := B + Ord(P1^) - Ord('A') + 10
        else if P1^ in ['a','f'] then 
          B := B + Ord(P1^) - Ord('a') + 10
        else 
          Exit; 
        Inc(P1);
        Dec(iLen);
        P2^ := Chr(B);
        Inc(P2);
      end;
      AStream.WriteBuffer(PChar(Buff)^, Length(Buff));
      Result := True;
    end;