如何在tcl中创建字节数组

时间:2012-08-14 02:18:35

标签: tcl

我想做这样的事情---

byte[] byte2 = new byte[19];

我怎样才能在tcl中做同样的事情?

2 个答案:

答案 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 formatappend

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