在 Visual Works Smalltalk 中从 CPointer 创建 CByteArray
Create a CByteArray from a CPointer in Visual Works Smalltalk
一些 C 函数 return aCPointer
到 C struct
。
C 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:
。
此方法适用于 ByteArray
和 UninterpretedBytes
。如果你想从字节中读取数据,UninterpretedBytes
可能更有帮助,因为你可以发送 #longAt:
之类的东西来从偏移量中读取 long
。
一些 C 函数 return aCPointer
到 C struct
。
C 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:
。
此方法适用于 ByteArray
和 UninterpretedBytes
。如果你想从字节中读取数据,UninterpretedBytes
可能更有帮助,因为你可以发送 #longAt:
之类的东西来从偏移量中读取 long
。