2012-08-14 27 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是一个明显的候选人)。