2015-05-21 14 views
1

在Delphi XE7,我們從字符串中使用將一些值字節,從字節字符串:如何unicode字符串轉換爲字節數組,反之亦然德爾福2007

MyBytes := TEncoding.Unicode.GetBytes(MyString); 

MyString := TEncoding.Unicode.GetString(MyBytes); 

我想寫我自己的函數,在Delphi-2007上得到相同的值。我真的不熟悉有關字符編碼,我想我應該在Delphi 2007使用WideString的類型(這是正確的?)

function StringToBytes(AValue : WideString) : TBytes; 
begin 
    Result := //... 
end; 

function BytesToString(AValue : TBytes) : WideString; 
begin 
    Result := //... 
end; 

有人能幫助我在寫這兩個函數?

+0

@DavidHeffernan:這有什麼關係嗎?讓我更詳細地解釋這個問題。爲了在數據庫中保存一些加密的字符串,我們使用我們自己的加密/解密函數在TBytes上工作。由於這個事實,在加密解密之前,我們需要在T​​Bytes中轉換字符串。問題來了。兩個不同的應用程序應該讀取這些字符串,並且應該能夠對這些字符串進行加密和解密(App1已經在Delphi-2007中編譯,app2已經在XE7中編譯過)。 – ExDev

+0

哦,我的話,現在我明白了。這是微不足道的。等一下。 –

回答

3

由於WideString是UTF-16編碼,並且您想要UTF-16編碼的字節數組,因此不需要轉換。你可以執行這樣的直接內存拷貝:

function StringToBytes(const Value : WideString): TBytes; 
begin 
    SetLength(Result, Length(Value)*SizeOf(WideChar)); 
    if Length(Result) > 0 then 
    Move(Value[1], Result[0], Length(Result)); 
end;  

function BytesToString(const Value: TBytes): WideString; 
begin 
    SetLength(Result, Length(Value) div SizeOf(WideChar)); 
    if Length(Result) > 0 then 
    Move(Value[0], Result[1], Length(Value)); 
end; 
+0

它不適用於Delphi-2007。作爲一個例子,行「ShowMessage(BytesToString(StringToBytes('aaa')));」顯示一個顯示'a'的對話框。我認爲這是因爲在delphi-2007中SizeOf(Char)是1。它似乎通過用WideChar替換Char來工作 – ExDev

+0

對不起。我誤解了這個評論。這是我需要更多的照顧。現在的答案是正確的。我忘記了Char是編譯器中的AnsiChar。 –

相關問題