您好我正在研究互联网代码,并引起了我的注意:
// ~ 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"的值更改为所有代码?
有人能帮助我吗?
字节表示'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)
后者看起来更有可能,但没有更多的信息,这都是猜测,抱歉.
| 归档时间: |
|
| 查看次数: |
5108 次 |
| 最近记录: |