3

我想做这样的事情——

byte[] byte2 = new byte[19];

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

4

2 回答 2

6

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以获得可以修改的内容,但必须确保它被正确存储或释放)。

于 2012-08-14T08:00:38.433 回答
5

我想进一步澄清多纳尔写的内容。

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

byte[] byte2 = new byte[19];

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

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

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

于 2012-08-14T08:24:42.983 回答