如何在tcl中创建字节数组

Anj*_*ali 2 tcl

我想做这样的事情

byte[] byte2 = new byte[19];
Run Code Online (Sandbox Code Playgroud)

我如何在tcl中做同样的事情?

Don*_*ows 5

Tcl处理字节数组的方式就好像它们是只包含U + 0000到U + 00FF的字符的字符串(即好像它们是ISO 8859-1字符一样)。实现中有一些细节(它们以字节数组的形式在Tcl的内部进行传输,而不是完整的Unicode字符串或某些可怕的伪UTF-8字节序列),但是您只是将它们视为字符串。

要创建一个长度为19个字节的NUL字节字符串,请执行以下操作:

set byte2 [string repeat "\u0000" 19]
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用binary命令对其进行操作(或encoding convertfrom将其重新解释为其他编码形式的字符串)。您实际上不应该在乎脚本是字节还是字符还是其他内容。特别是,TCL有很多是蛮好的操作字符串命令,他们的工作也很好的字节数组。

它是否真的是字节数组真正重要的唯一一点是使用C API时。在这一点上,如果您需要读取字节数组,则可以使用该字节数组Tcl_GetByteArrayFromObj来获取真实的字节数组(unsigned char以C语言表示),尽管如果不创建字节数组,或者更确切地说,如果上的引用计数Tcl_Obj大于1(即,如果Tcl_IsShared返回的是真实值;如果是,则重复进行复制Tcl_DuplicateObj以获取可以修改的内容,尽管随后必须确保将其正确存储或释放)。


kos*_*tix 5

我想进一步澄清 Donal 所写的内容。

应该强调的一点是,在 Tcl 中,对字节数组的操作主要类似于对字符串的操作。我的意思是,代码

byte[] byte2 = new byte[19];
Run Code Online (Sandbox Code Playgroud)

暗示 OP 然后想要byte2随机访问该C 样式数组的元素,用新值等替换它们。

相比之下,Tcl 中的这些东西以不同的方式工作。如果你想要一个几乎 C 风格的索引数组,你应该使用lists 代替,并且只有在binary format他即将将数据序列化到电线时才将结果列表转换为真正的字节字符串(使用命令)格式(或写入文件或其他)。当生成的字节数组以增量方式形成时,另一种方法很方便,通过一个接一个地附加值;在这种情况下,应该简单地使用binary formatappend

我会敦促 OP 查看tcllib 中处理二进制编码的一些模块(base64是一个明显的候选者)。