Delphi

时间:2015-08-18 14:46:18

标签: 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);

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

有人可以帮助我吗?

2 个答案:

答案 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); 是您的字符串。