Delphi中的字节值数组

Mat*_*sen 1 delphi

您好我正在研究互联网代码,并引起了我的注意:

// ~ Your Dll Here ~ Ex : 'C:\MS10046.dll'
  SizeNameDll : integer = 28;
  Dllx  : ARRAY [1..28] OF Byte =  ($00,$43,$00,$3A,$00,$5C,$00,$4D,$00,$53,$00,$31,$00,$30,$00,$30,$00,$34,$00,$36,$00,$2E,$00,$64,$00  ,$6C,$00,$6C);
Run Code Online (Sandbox Code Playgroud)

据说数组的内容值为"C:\ MS10046.dll"我不明白两件事,为什么SizeNameDll值是28,这不是"C:\ MS10046.dll"的确切长度?如何通过"c:/xampp/test.dll"等其他路由将"C:\ MS10046.dll"的值更改为所有代码?

有人能帮助我吗?

Rud*_*uis 5

字节表示'C:\MS10046.dll'大端UTF-16 Unicode中的文本.在UTF-16中,"字符"(或正确称为:代码点)由16位宽的代码单元组成,或者在Delphi中WideChar.因此每个代码单元的大小为两个字节.在little-endian中,基于Intel平台的默认值,这意味着'C'编码为$0043一个字节$43,后跟一个字节$00.在big-endian中,这是相反的,所以'C'(或$0043)$00后面跟着$43.同样的':':这是$3A,$00小端的,但是$00,$3A在大端.所以14个"字符"会导致您显示的数组.

由于数组似乎以a开头$00,因此必须是big-endian.

如果你必须使用的函数需要一个字节数组和一个长度,那么你应该把它称为:

var
  Dllx: TBytes;
  str: string;
begin
  str := 'c:\xampp\test.dll'; // I removed the spaces - they are wrong
  Dllx := TEncoding.BigEndianUnicode.GetBytes(str);
  if Length(Dllx) > 0 then
    YourFunction(... PByte(Dllx), Length(Dllx), ...);
Run Code Online (Sandbox Code Playgroud)

如果您展示了如何使用该数组,那将会有所帮助,IOW,显示更多的代码.Windows上的DLL需要大端编码是非常不寻常的.

很可能,如果根本不需要big-endian,你可以在没有转换的情况下做到:

if Length(str) > 0 then
  YourFunction(..., PChar(str), Length(str) * Sizeof(WideChar), ...);
Run Code Online (Sandbox Code Playgroud)

甚至(这一切都取决于函数的声明):

if Length(str) > 0 then
  YourFunction(..., PChar(str), Length(str), ...);
Run Code Online (Sandbox Code Playgroud)

后者看起来更有可能,但没有更多的信息,这都是猜测,抱歉.