0

私はこの機能を使用しており、逆の機能が必要です。HEX (unicode) 文字列を unicode (WideString) に変換します。それを元に戻すには逆関数が必要です。つまり、Widestring を HEX (Unicode) に戻します。

function _ConvertHexToWideString(AHex: AnsiString): WideString;
var wBinaryStream: TMemoryStream;
begin

  try
    wBinaryStream := TMemoryStream.Create;

    try
      wBinaryStream.Size := Length(AHex) div 2;

      if wBinaryStream.Size > 0 then
        HexToBin(PAnsiChar(AHex), wBinaryStream.Memory, wBinaryStream.Size);
    except
    end;
    SetString(Result, 
              PWideChar(wBinaryStream.Memory), 
              wBinaryStream.Size div SizeOf(WideChar));
  finally
    FreeAndNil(wBinaryStream);
  end;
end;
4

1 に答える 1

4

BinToHex()代わりに次のように使用して、単純に反対のことを行います。

function _ConvertWideStringToHex(AStr: WideString): AnsiString;
var
  wBinaryStream: TMemoryStream;
  iBufSize: Integer;
begin
  try
    wBinaryStream := TMemoryStream.Create;
    try
      iBufSize := Length(AStr) * SizeOf(WideChar);
      wBinaryStream.Size := iBufSize * 2;
      if iBufSize > 0 then
        BinToHex(PAnsiChar(Pointer(AStr)), PAnsiChar(wBinaryStream.Memory), iBufSize);
    except
    end;
    SetString(Result, 
              PAnsiChar(wBinaryStream.Memory), 
              wBinaryStream.Size div SizeOf(AnsiChar));
  finally
    FreeAndNil(wBinaryStream);
  end;
end;

これは次のように簡略化できます。

function _ConvertWideStringToHex(AStr: WideString): AnsiString;
var
  iBufSize: Integer;
begin
  iBufSize := Length(AStr) * SizeOf(WideChar);
  if iBufSize > 0 then begin
    SetLength(Result, iBufSize * 2);
    BinToHex(PAnsiChar(Pointer(AStr)), PAnsiChar(Result), iBufSize);
  end else
    Result := '';
end;
于 2013-04-15T23:10:52.700 に答える