2013-10-30 47 views
3

我想一個字符串轉換爲字節數組,代碼如下所示:轉換字符串到字節數組將無法正常工作

procedure StringToByteArray(const s : String; var tmp: array of Byte); 
var 
    i : integer; 
begin 
     For i:=1 to Length(s) do 
     begin 
      tmp[i-1] := Ord(s[i]); 
     end; 

end; 

S [I]這裏是第i個字符串元素( =在我的位置),我將它的數值保存到tmp。

這適用於某些字符,但不是所有的,例如:

奧德(「•」)返回十二月(149),這是我所期望的。

但是在我的程序中,Ord(s [i])爲同一個字符返回Dec(8226)!

EDIT1:我認爲,缺陷就在於我的其他功能 「ByteArrayToStr」

轉換當...

tmp:= 149 // tmp is of type byte 
Log('experiment: ' + Chr(tmp)); // prints "•" 
Log('experiment2 ' + IntToStr(Ord(Chr(tmp)))); // prints 149 

...來回,這似乎工作。

但使用相同的轉換在下面的功能將不能做到這一點:

function ByteArrayToStr(a : array of Byte) : String; 
var 
    S:String; 
    I:integer; 
begin 
    S:=''; 
    For I:=0 to Length(a) -1 do 
    begin 
      tmp := Chr(a[I]) ; // for a[I] equals 149 this will get me "?" instead of "•" 
      S:=S+tmp; 

    end; 

    Result:=S; 
end; 

要清楚: ByteArrayToStr不轉換奧德(149)爲「•」正如所料,因此StringToByteArray將不會在以後工作

回答

7

您需要將參數變爲AnsiString類型。通過這樣做,你可以寫函數是這樣的:

[Setup] 
AppName=My Program 
AppVersion=1.5 
DefaultDirName={pf}\My Program 
OutputDir=userdocs:Inno Setup Examples Output 

[Code] 
procedure StringToByteArray(const S: AnsiString; out ByteArray: array of Byte); 
var 
    I: Integer; 
begin 
    SetArrayLength(ByteArray, Length(S)); 
    for I := 1 to Length(S) do 
    ByteArray[I - 1] := Ord(S[I]); 
end; 

function ByteArrayToString(const ByteArray: array of Byte): AnsiString; 
var 
    I: Integer; 
begin 
    SetLength(Result, GetArrayLength(ByteArray)); 
    for I := 1 to GetArrayLength(ByteArray) do 
    Result[I] := Chr(ByteArray[I - 1]); 
end; 

procedure InitializeWizard; 
var 
    S: AnsiString; 
    ByteArray: array of Byte; 
begin 
    S := '•'; 
    StringToByteArray(S, ByteArray); 
    MsgBox(IntToStr(ByteArray[0]), mbInformation, MB_OK); 
    S := ''; 
    S := ByteArrayToString(ByteArray); 
    MsgBox(S, mbInformation, MB_OK); 
end; 
+0

作出的編輯我的帖子,請看看TLama –

+0

我也做了更新。 – TLama

+0

謝謝你,作品像一個魅力! –

相關問題