您好我正在研究互联网代码,并引起了我的注意:
// ~ 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);
据说数组的内容值为“C:\ MS10046.dll”我不明白两件事,为什么SizeNameDll值为28,这不是“C:\ MS10046.dll”的确切长度?如何通过“c:/xampp/test.dll”之类的其他路由将“C:\ MS10046.dll”的值更改为所有代码?
有人可以帮助我吗?
答案 0 :(得分:5)
字节表示大端UTF-16 Unicode中的文本'C:\MS10046.dll'
。在UTF-16中,"字符" (或正确调用:代码点)由16位宽的代码单元组成,或者在Delphi中WideChar
s组成。因此每个代码单元的大小为两个字节。在little-endian中,基于Intel平台的默认值,这意味着'C'
被编码为$0043
,其为字节$43
,后跟字节$00
。在big-endian中,这是相反的,因此'C'
(或$0043
)为$00
后跟$43
。 ':'
也是如此:这是小端的$3A,$00
,而大端的是$00,$3A
。所以14"字符"导致您显示的数组。
由于数组似乎以$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), ...);
如果您展示了如何使用该数组,那将会有所帮助,IOW,显示更多的代码。 Windows上的DLL需要大端编码是非常不寻常的。
很可能是,如果根本不需要big-endian,那么你可以不进行转换:
if Length(str) > 0 then
YourFunction(..., PChar(str), Length(str) * Sizeof(WideChar), ...);
或甚至(这一切都取决于函数的声明):
if Length(str) > 0 then
YourFunction(..., PChar(str), Length(str), ...);
后者看起来更有可能,但没有更多信息,这都是猜测,抱歉。
答案 1 :(得分:4)
这28个字节代表您编码为UTF-16BE的14个字符串。每个字符由16位字符元素表示。这就是长度为14的字符串消耗28个字节的原因。
要将一般字符串编码为UTF-16BE,您可以写:
<table id="tblMyTable" class="MyTableClass">
<tr>
<td style="width:90%;vertical-align:top;">
<table ClientIDMode="Static" id="tblMyTable1" runat="server" class="TableClass" style="-moz-min-width:600px; -ms-min-width:600px; -o-min-width:600px; -webkit-min-width:600px; min-width:600px; width:100%;">
<tr class="rowClass">
<td><div><input name="inputName" value="Name"></input></div>
</td>
<td class="AddNew" colspan="42"> + </td>
</tr>
<tr>
<td id="addType1" class="AddNew">+</td>
</tr>
</table>
<table ClientIDMode="Static" id="tblMyTable2" runat="server" class="TableClass" style="-moz-min-width:600px; -ms-min-width:600px; -o-min-width:600px; -webkit-min-width:600px; min-width:600px;">
<tr class="rowClass">
<td><div><input name="inputName" value="My Name"></input></div>
</td>
<td class="AddNew" colspan="42"> + </td>
</tr>
<tr>
<td id="addType2" class="AddNew">+</td>
</tr>
</table>
....
其中var
Bytes: TBytes;
....
Bytes := TEncoding.BigEndianUnicode.GetBytes(str);
是您的字符串。