2012-08-14 28 views
1

我想要做這樣的事情字節數組---如何創建TCL

byte[] byte2 = new byte[19]; 

我該怎麼做同樣的事情在TCL?

+0

你爲什麼要這麼做?我在問,因爲有不同的解決方案,取決於你需要做什麼 – 2012-08-14 07:03:37

回答

3

Tcl處理字節數組,就好像它們是僅包含從U + 0000到U + 00FF的字符的字符串(即,就好像它們是ISO 8859-1字符一樣)。在實現中有一些細節(它們是作爲字節數組在Tcl的內部傳輸的,而不是完整的Unicode字符串或一些可怕的字節序列),但是您只是將它們視爲字符串。

爲了使NUL字節是19個字節長的字符串,你這樣做:

set byte2 [string repeat "\u0000" 19] 

然後你可以使用binary命令就可以了(或encoding convertfrom操作來重新解釋它在其他一些字符串編碼)。你真的不應該在乎它是字節還是字符,或者你的腳本中的任何東西。特別是,Tcl有很多命令可以對字符串進行操作,並且它們在字節數組上也可以使用以及

真正重要的是它是否真的是一個字節數組,當你在C API中工作時。此時,如果您需要讀取字節數組,您可以使用Tcl_GetByteArrayFromObj來獲得真實的字節數組(儘管在C中爲unsigned char),但如果不創建字節數組,則不應該修改該字節數組,如果Tcl_Obj上的引用計數大於1(即,如果Tcl_IsShared返回真值;如果是,則複製Tcl_DuplicateObj以獲取可以修改的內容,但必須確保正確地存儲或取消分配)。

+0

字符串和字節數組之間的區別很重要:將這些數據寫入某種有線格式或從中讀取。 – kostix 2012-08-14 08:16:34

3

我想進一步澄清Donal寫了些什麼。

應該強調的一點是,在Tcl中,一個字節數組上的操作大多像字符串一樣。我的意思是,代碼

byte[] byte2 = new byte[19]; 

暗示那麼OP會想隨機訪問byte2 C風格數組的元素,用新值等

相反,這樣的事情在Tcl的工作方式不同取而代之。如果想要使用索引化的幾乎是C風格的數組,則應該使用list s代替,並且只在將數據序列化爲數據時將結果列表轉換爲實際字節字符串(使用binary format命令)一個有線格式(或寫入一個文件或其他)。當結果字節數組逐漸形成時,通過逐個附加值,另一種方法很方便;在這種情況下,應該簡單地使用binary formatappend

我希望OP看看處理二進制編碼的tcllib中的一些模塊(base64是一個明顯的候選人)。