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