如何在tcl中创建字节数组

如何在tcl中创建字节数组,tcl,Tcl,我想做这样的事情--- byte[]byte2=新字节[19]; 如何在tcl中执行相同的操作?tcl处理字节数组时,将其视为仅包含U+0000到U+00FF字符的字符串(即,将其视为ISO 8859-1字符)。实现中有一些细节(它们作为字节数组在Tcl内部传输,而不是作为完整的Unicode字符串或一些可怕的字节序列),但您只将它们视为字符串 要生成长度为19字节的NUL字节字符串,请执行以下操作: set byte2 [string repeat "\u0000" 19] 然后您可以使用

我想做这样的事情---

byte[]byte2=新字节[19];

如何在tcl中执行相同的操作?

tcl处理字节数组时,将其视为仅包含U+0000到U+00FF字符的字符串(即,将其视为ISO 8859-1字符)。实现中有一些细节(它们作为字节数组在Tcl内部传输,而不是作为完整的Unicode字符串或一些可怕的字节序列),但您只将它们视为字符串

要生成长度为19字节的NUL字节字符串,请执行以下操作:

set byte2 [string repeat "\u0000" 19]
然后您可以使用
binary
命令对其进行操作(或者
encoding convertfrom
将其重新解释为其他编码中的字符串)。您真的不应该关心脚本中是字节还是字符或其他内容。特别是,Tcl有很多命令可以很好地对字符串进行操作,它们在字节数组上也可以很好地工作


它是否真的是一个字节数组真正重要的唯一一点是在使用C API时。此时,如果需要读取用于获取实际字节数组的字节数组(
C中的unsigned char
),但如果没有创建该字节数组,或者更严格地说,如果
Tcl_Obj
上的引用计数大于1,则不应修改该字节数组(即,如果
Tcl\u ishared
返回一个真值;如果返回真值,则使用
Tcl\u DuplicateObj
进行复制,以获得可以修改的内容,但必须确保正确存储或解除分配)。

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

需要强调的是,在Tcl中,人们对字节数组的操作与对字符串的操作基本相同

byte[] byte2 = new byte[19];
提示OP随后将随机访问
字节2
C样式数组的元素,并用新值替换它们等

相反,Tcl中的这类东西的工作方式不同。如果想要一个索引的几乎是C风格的数组,那么应该使用
list
s,并且只有在[s]将数据序列化为有线格式(或写入文件或其他)时,才将结果列表转换为实字节字符串(使用
binary format
命令)。另一种方法在以增量方式形成结果字节数组时非常方便,方法是逐个追加值;在这种情况下,只需使用
二进制格式
追加


我想敦促OP从处理二进制编码的角度来看一些模块(
base64
是一个明显的候选者).

为什么要这样做?我之所以这么问,是因为根据需要做什么,有不同的解决方案。字符串和字节数组之间的区别还有另一个重要原因:将数据写入某种有线格式,或者从中读取。