INDY的 TIdBytes转换存在BUG,用的最新的10.5.7  一样啊,转换出错!!!procedure TForm1.RzBitBtn19Click(Sender: TObject);
var
  bb: TIdBytes;
  ss: AnsiString;
begin
  ss := '500000000701CCCCCCCC0400000061646D696E00000000000000000000000061646D696E00000000000000000000000031313131000000000000000000000000004448435630383037303830310000000000';
  ss := HexToStr(ss);
  bb := ToBytes(ss);
end;procedure TForm1.RzBitBtn20Click(Sender: TObject);
var
  bb: TIdBytes;
  ss: AnsiString;
begin
  SetLength(bb, 82);
  bb[0] := 80;
  bb[1] := 0;
  bb[2] := 0;
  bb[3] := 0;
  bb[4] := 7;
  bb[5] := 1;
  bb[6] := 204;
  bb[7] := 204;
  bb[8] := 204;
  bb[9] := 204;
  bb[10] := 4;
  bb[11] := 0;
  bb[12] := 0;
  bb[13] := 0;
  bb[14] := 97;
  bb[15] := 100;
  bb[16] := 109;
  bb[17] := 105;
  bb[18] := 110;
  bb[19] := 0;
  bb[20] := 0;
  bb[21] := 0;
  bb[22] := 0;
  bb[23] := 0;
  bb[24] := 0;
  bb[25] := 0;
  bb[26] := 0;
  bb[27] := 0;
  bb[28] := 0;
  bb[29] := 0;
  bb[30] := 0;
  bb[31] := 97;
  bb[32] := 100;
  bb[33] := 109;
  bb[34] := 105;
  bb[35] := 110;
  bb[36] := 0;
  bb[37] := 0;
  bb[38] := 0;
  bb[39] := 0;
  bb[40] := 0;
  bb[41] := 0;
  bb[42] := 0;
  bb[43] := 0;
  bb[44] := 0;
  bb[45] := 0;
  bb[46] := 0;
  bb[47] := 0;
  bb[48] := 49;
  bb[49] := 49;
  bb[50] := 49;
  bb[51] := 49;
  bb[52] := 0;
  bb[53] := 0;
  bb[54] := 0;
  bb[55] := 0;
  bb[56] := 0;
  bb[57] := 0;
  bb[58] := 0;
  bb[59] := 0;
  bb[60] := 0;
  bb[61] := 0;
  bb[62] := 0;
  bb[63] := 0;
  bb[64] := 0;
  bb[65] := 68;
  bb[66] := 72;
  bb[67] := 67;
  bb[68] := 86;
  bb[69] := 48;
  bb[70] := 56;
  bb[71] := 48;
  bb[72] := 55;
  bb[73] := 48;
  bb[74] := 56;
  bb[75] := 48;
  bb[76] := 49;
  bb[77] := 0;
  bb[78] := 0;
  bb[79] := 0;
  bb[80] := 0;
  bb[81] := 0;
  ss := BytesToString(bb);
end;第二个的BB的HEX值就是第一个的SS可是INDY里的转换 值不对

解决方案 »

  1.   

    下面是 IdGlobal里的转换函数function BytesToString(const AValue: TIdBytes; AByteEncoding: TIdTextEncoding = nil
      {$IFDEF STRING_IS_ANSI}; ADestEncoding: TIdTextEncoding = nil{$ENDIF}
      ): string; overload;
    {$IFDEF USE_INLINE}inline;{$ENDIF}
    begin
      Result := BytesToString(AValue, 0, -1, AByteEncoding
        {$IFDEF STRING_IS_ANSI}, ADestEncoding{$ENDIF}
        );
    end;function BytesToString(const AValue: TIdBytes; const AStartIndex: Integer;
      const ALength: Integer = -1; AByteEncoding: TIdTextEncoding = nil
      {$IFDEF STRING_IS_ANSI}; ADestEncoding: TIdTextEncoding = nil{$ENDIF}
      ): string; overload;
    var
      LLength: Integer;
      {$IFDEF STRING_IS_ANSI}
      LBytes: TIdBytes;
      {$ENDIF}
    begin
      {$IFDEF STRING_IS_ANSI}
      LBytes := nil; // keep the compiler happy
      {$ENDIF}
      LLength := IndyLength(AValue, ALength, AStartIndex);
      if LLength > 0 then begin
        EnsureEncoding(AByteEncoding);
        {$IFDEF STRING_IS_UNICODE}
        Result := AByteEncoding.GetString(AValue, AStartIndex, LLength);
        {$ELSE}
        EnsureEncoding(ADestEncoding);
        LBytes := TIdTextEncoding.Convert(
          AByteEncoding,
          ADestEncoding,
          AValue, AStartIndex, LLength);
        SetString(Result, PAnsiChar(LBytes), Length(LBytes));
        {$ENDIF}
      end else begin
        Result := '';
      end;
    end;
    function ToBytes(const AValue: string; ADestEncoding: TIdTextEncoding = nil
      {$IFDEF STRING_IS_ANSI}; ASrcEncoding: TIdTextEncoding = nil{$ENDIF}
      ): TIdBytes; overload;
    {$IFDEF USE_INLINE}inline;{$ENDIF}
    begin
      Result := ToBytes(AValue, -1, 1, ADestEncoding
        {$IFDEF STRING_IS_ANSI}, ASrcEncoding{$ENDIF}
        );
    end;function ToBytes(const AValue: string; const ALength: Integer; const AIndex: Integer = 1;
      ADestEncoding: TIdTextEncoding = nil
      {$IFDEF STRING_IS_ANSI}; ASrcEncoding: TIdTextEncoding = nil{$ENDIF}
      ): TIdBytes; overload;
    var
      LLength: Integer;
    begin
      LLength := IndyLength(AValue, ALength, AIndex);
      if LLength > 0 then
      begin
        EnsureEncoding(ADestEncoding);
        {$IFDEF STRING_IS_UNICODE}
        Result := ADestEncoding.GetBytes(Copy(AValue, AIndex, LLength));
        {$ELSE}
        EnsureEncoding(ASrcEncoding, encOSDefault);
        Result := TIdTextEncoding.Convert(
          ASrcEncoding,
          ADestEncoding,
          RawToBytes(AValue[AIndex], LLength));
        {$ENDIF}
      end
      else
      begin
        SetLength(Result, 0);
      end;
    end;function ToBytes(const AValue: Char; ADestEncoding: TIdTextEncoding = nil
      {$IFDEF STRING_IS_ANSI}; ASrcEncoding: TIdTextEncoding = nil{$ENDIF}
      ): TIdBytes; overload;
    {$IFDEF STRING_IS_UNICODE}
    var
      LChars: {$IFDEF DOTNET}array[0..0] of Char{$ELSE}TIdWideChars{$ENDIF};
    {$ENDIF}
    begin
      EnsureEncoding(ADestEncoding);
      {$IFDEF STRING_IS_UNICODE}
        {$IFNDEF DOTNET}
      SetLength(LChars, 1);
        {$ENDIF}
      LChars[0] := AValue;
      Result := ADestEncoding.GetBytes(LChars);
      {$ELSE}
      EnsureEncoding(ASrcEncoding, encOSDefault);
      Result := TIdTextEncoding.Convert(
        ASrcEncoding,
        ADestEncoding,
        RawToBytes(AValue, 1));
      {$ENDIF}
    end;
      

  2.   

    ToBytes(ss, TEncoding.Default);BytesToString(bb, TEncoding.Default);