2014-02-05 36 views
4

在我的德爾福VCL表格應用程序中,我有一個程序,它有一個TBuff參數(之前定義爲字節數組)。在這個過程中,我必須將參數轉換爲一個字符串。德爾福 - 字節數組到字符串

procedure Form1.Convert(Collect: TBuff); 
var 
    str: String; 
begin 
    str := SysUtils.StringOf(Collect); 
end; 

編譯後,我就警告過這個編譯器錯誤的存在:

Incompatible types :'System.TArray<System.TByte>' and 'TBuff'

回答

7

,你遇到的是你自己定義的字節數組類型像這樣的問題:

type 
    TBuff = array of Byte; 

您的這種私有類型與其他字節數組類型不兼容。大多數使用字節數組的RTL函數都使用聲明爲TArray<Byte>的RTL類型TBytes

您要做的第一件事是從您的程序中刪除TBuff,而不是使用TBytes。如果您繼續使用TBuff,您會發現所有的字節數組代碼都存在於自己的貧民窟中,無法與使用TBytes的庫功能交互。所以,逃離貧民窟,並從存在中刪除你的TBuff類型。

現在,爲了將字節數組轉換爲字符串,您需要提供編碼信息來執行此操作。您已選擇StringOf,這些應該被視爲傳統功能。最好在轉換時更加明確,並使用TEncoding

例如,如果字節數組是UTF-8,你寫:

str := TEncoding.UTF8.GetString(ByteArray); 

如果字節數組在本地ANSI編碼的編碼你寫:

str := TEncoding.ANSI.GetString(ByteArray); 

在你的情況下,使用StringOf表示字節數組是ANSI編碼的,所以後面的例子就是你所需要的。

+2

+1可愛的答案 –

+2

只需要注意,Delphi XE2添加了.ANSI屬性到TEncoding,您可以使用,而不是.Default(如果您在Mac OSX上,現在會返回UTF8)。在我知道字節數組的情況下是ANSI我已經切換到使用.ANSI屬性更加明確(並且在他們決定改變默認含義的情況下)。 – MarkF

+0

@MarkF他們不會改變默認的含義,但代碼更好地寫如你所建議的。我改變了它。謝謝。 –