我在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
答案 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;