5

我已经通读了pycapnp 快速入门和文档,但我没有看到关于如何读取和写入基本列表对象(如浮点列表)的提及。

特别是,我知道如果我在 capnp 文件中编写自定义类型,那么我可以使用类似的东西读取该类型的对象

addressbook_capnp.Person.from_bytes(encoded_message)

我想知道的是读取这样的浮点数列表的语法。我想它看起来像

capnp.List.Float64.from_bytes(encoded_message)

但我根本找不到正确的语法。此外,由于 Capn Proto 不会从 .capnp 文件中导出别名,因此我不能只在那里定义一个浮点列表(或者看起来如此)。

有人可以告诉我在 pycapnp 中读取、写入和创建基本对象列表的正确语法吗?


编辑:

例如,在 C++ 中,我可以像这样创建一个列表对象(没有自定义类型):

::capnp::MallocMessageBuilder message; 
auto capnp_point_cloud = message.initRoot<::capnp::List<Val>>(num_axes);
for (size_t i = 0; i < num_axes; ++i) { 
    capnp_point_cloud.set(i, array[i]);
}
4

1 回答 1

-2

我已经阅读了文档,在 python 中使用 capnp 列表似乎很容易。

首先,您需要一个 .capnp 文件,其中包含一个带有列表变量的类的定义:

#floatbook.capnp
@0xbde7cca9517a2373;

struct FloatBook {
  floats @0 :List(Float64);
}

要使用我的 .capnp 架构中的数据写入然后读取二进制文件,我编写了以下 Python 脚本:

import capnp

# Load capnp schema manually from file
capnp.remove_import_hook()
floatbook_capnp = capnp.load('floatbook.capnp')

# Create a new FloatBook object from imported capnp schema
floatbook = floatbook_capnp.FloatBook.new_message()

# Initialize a new list inside the FloatBook object and set its values
floats = floatbook.init('floats', 2)
floats[0] = 1.5
floats[1] = 2.5

# Write the FloatBook object to a binary file
f = open('example.bin', 'w+b')
floatbook.write(f)

# Read the FloatBook object back from the created binary file
f = open('example.bin', 'rb')
floatbook = floatbook_capnp.FloatBook.read(f)

# Print every float inside the read FloatBook object
print(type(floatbook.floats))
for float in floatbook.floats:
    print(float)

这是我运行此脚本后 PowerShell 控制台的内容:

PS C:\Users\anon> & test.py
<class 'capnp.lib.capnp._DynamicListReader'>
1.5
2.5

编辑1:

除了写入和读取文件之外,还可以写入和读取字节字符串:

serialized = floatbook.to_bytes()
floatbook = floatbook_capnp.FloatBook.from_bytes(serialized)
于 2022-02-19T13:04:49.127 回答