我最近在 Stack Overflow 上问了一个问题,关于如何将我的数据从 16 位整数,后跟未确定数量的 void*-cast 内存转换为无符号字符的 std::vector,以便使用已知的套接字库作为 NetLink,它使用一个签名看起来像这样的函数来发送原始数据:
void rawSend(const vector<unsigned char>* data);
(作为参考,这是那个问题:Casting an unsigned int + a string to an unsigned char vector)
问题已成功回答,我感谢那些回答的人。Mike DeSimone 给出了一个 send_message() 函数的示例,该函数将数据转换为 NetLink 接受的格式(std::vector),如下所示:
void send_message(NLSocket* socket, uint16_t opcode, const void* rawData, size_t rawDataSize)
{
vector<unsigned char> buffer;
buffer.reserve(sizeof(uint16_t) + rawDataSize);
buffer.push_back(opcode >> 8);
buffer.push_back(opcode & 0xFF);
const unsigned char* base(reinterpret_cast<const unsigned char*>(rawData));
buffer.insert(buffer.end(), base, base + rawDataSize);
socket->rawSend(&buffer);
}
这看起来正是我所需要的,所以我开始编写一个随附的 receive_message() 函数......
...但是我很尴尬地说我并不完全理解所有的位移和诸如此类的东西,所以我在这里遇到了障碍。在过去近十年中我编写的所有代码中,我的大部分代码都是使用高级语言编写的,而我的其余代码从未真正需要低级内存操作。
回到编写 receive_message() 函数的主题,正如你所想象的,我的出发点是 NetLink 的 rawRead() 函数,其签名如下所示:
vector<unsigned char>* rawRead(unsigned bufferSize = DEFAULT_BUFFER_SIZE, string* hostFrom = NULL);
看起来我的代码将像这样开始:
void receive_message(NLSocket* socket, uint16_t* opcode, const void** rawData)
{
std::vector<unsigned char, std::allocator<unsigned char>>* buffer = socket->rawRead();
std::allocator<unsigned char> allocator = buffer->get_allocator(); // do I even need this allocator? I saw that one is returned as part of the above object, but...
// ...
}
在第一次调用 rawRead() 之后,看来我需要遍历向量,从中检索数据并反转位移操作,然后将数据返回到 *rawData 和 *opcode。同样,我对移位不是很熟悉(我做了一些谷歌搜索来理解语法,但我不明白为什么上面的 send_message() 代码需要移位),所以我对下一步感到茫然这里。
有人可以帮我理解如何编写这个随附的 receive_message() 函数吗?作为奖励,如果有人可以帮助解释原始代码,以便我将来知道它是如何工作的(特别是在这种情况下如何进行转换以及为什么它是必要的),那将有助于加深我对未来的理解。
提前致谢!