当您回读它们时,uint8_t*数组可能会被转换为char*数组,但是要注意!(以\x00字节结束)。C和C++中的许多字符串解释函数都不希望这样。有一些函数,如strncpy和std::string的two-argument constructor,可以给它字符串长度信息,这样它们就不会寻找空终止符,字符串长度信息是计数器分支,上面的nbranch。 我承认这是令人不快的。我在Uroot上使用just opened a feature request以自然的方式写入字符串数据,使用ROOT的TLeafC,而不是这个黑客。
1条答案
按热度按时间2uluyalo1#
“字符串”不是WritableTTree支持的数据类型之一。请查看www.example.com下的蓝框https://uproot.readthedocs.io/en/latest/basic.html#writing-ttrees-to-a-file以获取完整列表。
但是,也可以写一些字符串类型的数据,字符串的Awkward Arrays就是
uint8
类型的列表,带有特殊的元数据(__array__: "strings"
参数),指示它应该被解释为字符串,实际上有两种类型,"string"
和"bytestring"
,我们假设前者是UTF-8编码的,而后者不是。通过从数组中删除参数,这些数据 * 可以 * 写入ROOT文件,这样它看起来就像一个普通的整数数组:
下面是将这些数据写入ROOT文件的方法:
当您回读它们时,
uint8_t*
数组可能会被转换为char*
数组,但是要注意!(以\x00
字节结束)。C和C++中的许多字符串解释函数都不希望这样。有一些函数,如strncpy和std::string
的two-argument constructor,可以给它字符串长度信息,这样它们就不会寻找空终止符,字符串长度信息是计数器分支,上面的nbranch
。我承认这是令人不快的。我在Uroot上使用just opened a feature request以自然的方式写入字符串数据,使用ROOT的
TLeafC
,而不是这个黑客。