我想做这样的事情——
byte[] byte2 = new byte[19];
我怎么能在 tcl 做同样的事情?
Tcl 处理字节数组,就好像它们是只包含从 U+0000 到 U+00FF 字符的字符串(即,好像它们是 ISO 8859-1 字符)。实现中有一些细节(它们作为字节数组在 Tcl 的内部传输,而不是完整的 Unicode 字符串或一些可怕的伪 UTF-8字节序列),但您只需将它们视为字符串。
要创建一个 19 字节长的 NUL 字节字符串,请执行以下操作:
set byte2 [string repeat "\u0000" 19]
然后您可以使用该binary
命令对其进行操作(或encoding convertfrom
将其重新解释为其他编码的字符串)。您真的不应该关心它是字节还是字符或脚本中的任何内容。特别是,Tcl 有很多命令可以很好地对字符串进行操作,并且它们在字节数组上也同样有效。
唯一真正重要的是它是否真的是一个字节数组是当您在 C API 中工作时。那时,如果您需要读取Tcl_GetByteArrayFromObj
用于获取真实字节数组(unsigned char
在 C 中)的字节数组,但如果您没有创建该字节数组,或者从技术上讲,如果上的引用计数Tcl_Obj
大于 1(即,如果Tcl_IsShared
返回一个真值;如果是,则复制 withTcl_DuplicateObj
以获得可以修改的内容,但必须确保它被正确存储或释放)。
我想进一步澄清多纳尔写的内容。
应该强调一点,在 Tcl 中,对字节数组的操作主要类似于对字符串的操作。我是说代码
byte[] byte2 = new byte[19];
提示 OP 然后希望byte2
随机访问该 C 样式数组的元素,用新值等替换它们。
相比之下,Tcl 中的这些东西的工作方式不同。如果一个人想要一个几乎是 C 风格的索引数组,那么应该使用s 来代替,并且仅在 [s] 他即将将数据序列化到电线时list
将结果列表转换为真正的字节字符串(使用命令)binary format
格式(或写入文件或其他)。当结果字节数组通过一个接一个地附加值来增量形成时,另一种方法很方便;在这种情况下,应该简单地使用binary format
and append
。
我会敦促 OP 查看tcllib 中处理二进制编码的一些模块(base64
这是一个明显的候选者)。