Gần đây tôi đã hỏi một câu hỏi ở đây về Stack Overflow về cách truyền dữ liệu của tôi từ một số nguyên 16 bit, theo sau là một số lượng không xác định của bộ nhớ * * vào một std: : vector của chars unsigned vì lợi ích của việc sử dụng một thư viện socket gọi là nETLINK trong đó sử dụng một hàm mà chữ ký trông như thế này để gửi dữ liệu thô:Trong C++, về các kiểu chuyển dịch bit và đúc
void rawSend(const vector<unsigned char>* data);
(để tham khảo, đây là câu hỏi rằng: Casting an unsigned int + a string to an unsigned char vector)
Câu hỏi đã được trả lời thành công và tôi rất biết ơn những người đã trả lời. Mike Desimone đáp lại bằng một ví dụ về một hàm send_message() có thể chuyển đổi dữ liệu sang một định dạng mà NETLINK chấp nhận (một std :: vector), trông như thế này:
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);
}
này có vẻ là chính xác những gì tôi cần , và vì vậy tôi đặt ra để viết một hàm receive_message() đi kèm ...
... nhưng tôi xấu hổ khi nói rằng tôi không hoàn toàn hiểu tất cả các thay đổi bit và không có điều gì, vì vậy tôi đã chạy vào một bức tường ở đây. Trong tất cả các mã tôi từng viết trong gần một thập kỷ qua, hầu hết mã của tôi đã ở các ngôn ngữ cấp cao hơn và phần còn lại của mã của tôi chưa bao giờ thực sự được gọi cho các hoạt động bộ nhớ mức thấp hơn.
Quay trở lại chủ đề của văn bản là một chức năng receive_message(), điểm khởi đầu của tôi, như bạn có thể tưởng tượng, là NETLINK của rawRead() chức năng, có chữ ký trông như thế này:
vector<unsigned char>* rawRead(unsigned bufferSize = DEFAULT_BUFFER_SIZE, string* hostFrom = NULL);
Dường như mã của tôi sẽ bắt đầu một cái gì đó như thế này:
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...
// ...
}
Sau đó cuộc gọi đầu tiên để rawRead(), nó xuất hiện tôi sẽ cần phải lặp qua các vector, lấy dữ liệu từ nó và đẩy lùi các hoạt động bitshifting, và sau đó trả lại dữ liệu vào * rawData và * opcode. Một lần nữa, tôi không quen thuộc với bithifting (tôi đã làm một số googling để hiểu cú pháp, nhưng tôi không hiểu lý do tại sao trên send_message() mã đòi hỏi phải thay đổi ở tất cả), vì vậy tôi là một mất mát cho tôi bước tiếp theo ở đây.
Ai đó có thể giúp tôi hiểu cách viết hàm receive_message() đi kèm này không? Như một phần thưởng, nếu ai đó có thể giúp giải thích mã gốc để tôi biết cho tương lai nó hoạt động như thế nào (đặc biệt, cách dịch chuyển hoạt động trong trường hợp này và tại sao nó cần thiết), điều đó sẽ giúp tôi hiểu sâu hơn về tương lai.
Cảm ơn trước!
Cảm ơn thông tin; Tôi đã học được khá nhiều. Tôi cũng sẽ xem xét một thư viện socket mới như bạn đã đề nghị .. Tôi đồng ý rằng thư viện này trông rất kém hiệu quả. – Josh1billion