在 Visual Works Smalltalk 中从 CPointer 创建 CByteArray

Create a CByteArray from a CPointer in Visual Works Smalltalk

一些 C 函数 return aCPointerC structC struct 已知。
现在我想把 C struct 变成 ByteArray。基本上将结构的内容复制到 ByteArray.
GemStone/S 中,可以通过以下方式完成:
CByteArray fromCPointer: aCPointer numBytes: 120.
“这将使用 CPointer 引用的结构的内容创建一个 CByteArray(仅复制 120 个字节)”

Visual Works 上有类似的东西吗? 我还没有找到它。 可以在 Visual Works 级别复制 C 结构,但只是一个结构,可以在低级别处理它。

如果aCPointer指向一个char *的结构 例如:

struct Names 
{char * name;
char * longname;} name;

然后:

(aCPointer at: 0) copyCStringFromHeap. "answer [name]"
(aCPointer at: 1) copyCStringFromHeap. "answer [longname]"

对于带有 char * 的结构,它工作得很好,没有用其他 C 类型测试。

只有相当难看的 #copyAt:to:size:startingAt: 可以发送给指针。你需要自己分配一个ByteArray(确保它足够大)。

answer := ByteArray new: size.
pointer
        copyAt: 0
        to: answer
        size: size
        startingAt: 1.

另一种方式(字节数组 -> 指针)将使用 #copyAt:from:size:startingAt:

此方法适用于 ByteArrayUninterpretedBytes。如果你想从字节中读取数据,UninterpretedBytes 可能更有帮助,因为你可以发送 #longAt: 之类的东西来从偏移量中读取 long