我有这样的代码:
ByteArray ret;
ret.resize( MAX( body_left, tmp_read.size() ) );
while ( body_left > 0 ) {
ByteArray::Write r = tmp_read.write();
int rec = 0;
err = connection->get_partial_data( r.ptr(), MIN( body_left, tmp_read.size() ), rec );
if ( rec > 0 ) {
ByteArray::Write w = ret.write();
copymem( w.ptr(), r.ptr(), rec );
body_left -= rec;
}
}
我发现理解这段代码很有挑战性。几个问题:
是ret.resize(MAX(body_left,tmp_read.size()));
分配ByteArray
最高的body_left
还是tmp_read.size()
?
InByteArray::Write r = tmp_read.write();
是否r
成为指向空间中将用于写入数据的位置的指针?
在ByteArray::Write w = ret.write();
, 是否w
像上一个问题一样变成指针r
?
此外,在这一行中:
copymem(w.ptr(),r.ptr(),rec);
据我了解这一行,在指针下收集的所有数据都r
被复制到指针下的位置w
。问题是它们的大小不同,如何移动指针w.ptr()
以保持数据完整且顺序正确?或者是w.ptr()
指向函数的指针,这应该不是问题。
额外的上下文:
方法get_partial_data
返回数据块 - 比如说 20、20 和 10 个字节。变量ret
应该是 50 字节长,并将这些块合并为一个ByteArray
。
不幸的是,我在这个项目中找不到定义ByteArray
,所以我猜它是另一个库的一部分(也许是 libGL?)。
我知道这个问题不是很精确,我正在大步向前,但如果有人能帮助我,我将不胜感激。
原始类和项目此代码取自:
https://github.com/okamstudio/godot/blob/master/core/io/http_client.cpp
第 503-516 行。
它的形状不同,因为我已经应用了肮脏的技巧(效果不佳)。