将字符串转换为TByteDynArray

时间:2016-04-04 21:05:17

标签: delphi

我在Delphi中有一个String对象。我想将其转换为TByteDynArray。我已经尝试了下面的实现。但是在调试时我发现binaryData在赋值后是空的。我做错了什么?

procedure convertStringToTByteDynArray;
var
  binaryData:TByteDynArray;
  Data: String;

begin
   Data := '8080100B1D472';
  //Copy over string to TByteDynArray
  SetLength(binaryData,Length(Data));
  Move(Data[1],binaryData,Length(Data)); 
end

1 个答案:

答案 0 :(得分:4)

在{2007}及更早版本中,Char的大小为1个字节,但在Delphi 2009及更高版本中为2个字节。在后一种情况下,代码会将UTF-16数据放入bytearray中,但只复制一半字符。

你犯的核心错误是将binarydata单独传递给Move()传递变量本身的内存位置,这只是指向其他内存的指针。传递binarydata[0]代替传递TByteDynArray所指向的已分配内存的第一个元素的内存位置。这就是你需要传递的东西。

我还添加了Length()检查,以避免在启用这些检查时出现一些范围检查错误。

procedure convertStringToTByteDynArray;
var
  binaryData: TByteDynArray;
  Data: String;
begin
  Data := '8080100B1D472';
  //Copy over string to TByteDynArray
  SetLength(binaryData, Length(Data) * sizeof(Char));
  if Length(Data) > 0 then
    Move(Data[1], binaryData[0], Length(Data) * sizeof(Char)); 
end;

可替换地:

procedure convertStringToTByteDynArray;
var
  binaryData: TByteDynArray;
  Data: String;
begin
  Data := '8080100B1D472';
  //Copy over string to TByteDynArray
  SetLength(binaryData, Length(Data) * sizeof(Char));
  Move(PChar(Data)^, PByte(binaryData)^, Length(binaryData)); 
end;