【问题标题】:How to write strings and integers in a ring buffer?如何在环形缓冲区中写入字符串和整数?
【发布时间】:2014-12-05 23:25:09
【问题描述】:

如何在环形缓冲区中写入字符串和整数?我想将多个字符串和整数写入环形缓冲区,但我的 C++ 知识有限。如果您需要更多信息,请告诉我。感谢您提供的任何帮助。

这里是我要写的整数和字符串变量以及环形缓冲区的写函数:

string payload;
int byte_pos;

size_t ringbuffer::write(u_char *data, size_t bytes)
{
  if (bytes == 0) return 0;

  size_t capacity = capacity_;
  size_t bytes_to_write = std::min(bytes, capacity - size_);

  // Write in a single step
  if (bytes_to_write <= capacity - end_index_)
  {
    memcpy(data_ + end_index_, data, bytes_to_write);
    end_index_ += bytes_to_write;
    if (end_index_ == capacity) end_index_ = 0;
  }
  // Write in two steps
  else
  {
    size_t size_1 = capacity - end_index_;
    memcpy(data_ + end_index_, data, size_1);
    size_t size_2 = bytes_to_write - size_1;
    memcpy(data_, data + size_1, size_2);
    end_index_ = size_2;
  }

  size_ += bytes_to_write;
  return bytes_to_write;
}

【问题讨论】:

  • 请详细说明您的问题:您想做什么?只需使用给定的输入调用此函数即可?
  • 是的,我的论点不正确。例如,我尝试了 (payload, sizeof(payload)) 以及许多其他东西,但我总是得到无效的参数。所以我的问题是如何为字符串调用一次函数,为整数调用一次函数。感谢您对此事的关注。
  • 它是“(字符串和数字)的缓冲区”还是“(字符串或数字)的缓冲区”?您将分别使用structunion。显示的代码示例非常不完整,并且缺少关于它应该如何工作的 cmets。对我来说,它看起来更像是一些混乱(比如使用 C++ 语法的汇编语言)而不是环形缓冲区。

标签: c++ circular-buffer


【解决方案1】:

您必须将 std::string 变量转换为指向 char 的 C 样式指针:

string payload;
char* cpayload = payload.c_str();
int len = strlen(cpayload);
ringbuffer::write(cpayload, len*sizeof(char));

【讨论】:

  • 无效参数候选者是:unsigned int write(unsigned char *, unsigned int)
  • 然后转换len: unsigned int len = (unsigned int) strlen(cpayload) * sizeof(char) 并使用len 作为第二个参数。
  • 仍然没有工作,但我想我发现了问题所在。有兴趣可以查看我的回答,感谢您对此事的关注。
【解决方案2】:

这似乎是有效的,但我还没有验证我在环形缓冲区中究竟得到了什么,但没有错误。

ringbuffer::write((u_char*) payload.c_str(), payload.length());
ringbuffer::write((u_char*) &byte_pos, sizeof(byte_pos));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2022-11-12
    • 1970-01-01
    相关资源
    最近更新 更多