【问题标题】:C++ String to byteArray Convertion and AdditionC++ 字符串到字节数组的转换和加法
【发布时间】:2015-09-23 14:03:41
【问题描述】:

我有一个要转换为 byteArray 的字符串,然后我希望将此 byteArray 添加到另一个 byteArray,但 在该 byteArray 的开头

让我们说这是我拥有的字符串

  string suffix = "$PMARVD";

这是我现有的 byteArray(忽略那里的对象,它是一个 .proto 对象,现在无关紧要):

int size = visionDataMsg.ByteSize(); // see how big is it
char* byteArray = new char[size]; //create a bytearray of that size

visionDataMsg.SerializeToArray(byteArray, size); // serialize it 

所以我想做的是这样的:

char* byteArrayforSuffix = suffix.convertToByteArray();
char* byteArrayforBoth = byteArrayforSuffix + byteArray;

用 C++ 做这个吗?

编辑:我应该补充一点,在连接操作之后,完整的 byteArrayforBoth 将在:

// convert bytearray to vector
vector<unsigned char> byteVector(byteArrayforBoth, byteArrayforBoth + size);

【问题讨论】:

  • 只需使用std::string 并连接字符串。
  • @PaoloM 没有两个字符串,有一个对象和一个字符串。两者都将转换为 byteArrays。

标签: c++ string bytearray


【解决方案1】:

std::string 背后的整个想法是将 C 风格的字符串(以空字符结尾的字符/字节数组)封装在一个管理所有内容的类中。

您可以使用std::string::data 方法超出内部字符数组。示例:

std::string hello ("hello") , world(" world");
auto helloWorld = hello + world;
const char* byteArray = helloWorld.data();

编辑: ByteArray 是char[]unsigned char[] 的内置类型,与Java 或C# 不同,您不能只是将内置字节数组“附加”到另一个。正如您所建议的,您只需要一个无符号字符向量。在这种情况下,我会简单地创建一个利用 push_back 的实用程序函数:

void appendBytes(vector<unsigend char>& dest,const char* characterArray,size_t size){
    dest.reserve(dest.size() + size);
    for (size_t i=0;i<size;i++){
       dest.push_back(characterArray[i]);
    }
}

现在,使用您提供的对象:

std::vector<unsigned char> dest;
appendBytes(dest, suffix.data(),suffix.size());
auto another = visionDataMsg.SerializeToArray(byteArray, size); 
appendBytes(dest,another,size);

【讨论】:

  • 为什么要在代码中添加“自动”?有什么好处?
  • 我想撒巧克力和糖果,但 stackoverflow 不允许。所以我选择了自动。
  • 避免使用这些以及自动,除非元编程。对您的健康不利,对您的牙齿不利,对您的习惯不利。 Auto 是为元编程和迭代容器而发明的(因为您不能通过对象实例引用嵌套类型,在我看来这是一个缺陷)。在您的示例中, auto 只是混淆和混淆。
  • 这里真的不适合谈论汽车的可用性。
  • 为什么要拨打shrink_to_fit
【解决方案2】:

报废内置数组。你有向量。这是完全有效的类型安全解决方案,我花了 3 分钟输入:

int size = visionDataMsg.ByteSize(); // see how big is it
std::vector<char> byteArray(size);

visionDataMsg.SerializeToArray(&byteArray[0], size); // serialize it 

std::string str("My String");
byteArray.reserve(byteArray.size() + str.size());
std::copy(str.begin(), str.end(), std::back_inserter(byteArray));

【讨论】:

  • 您确定可以更改函数SerializeToArray() 的参数吗?请注意,该函数来自协议缓冲区内容自动生成的 proto 文件。
  • 参数没有变化。 SerializeToArray 不知道有什么区别。
  • 什么是myArray btw?它有什么用?
  • 有没有办法坚持使用 byteArray,因为我必须将其传递给 vector&lt;unsigned char&gt; byteVector(byteArray, byteArray + size);,因为最终它将通过一些网络功能传递给它。当我按照您提供的方式进行操作时,会出现错误,因为我们不再使用 byteArray,而是使用向量;这不适合这种情况。
  • 不确定你的意思。我给了你一个完全按照你想要的方式工作的解决方案。现在,由于无论如何您都将使用向量(byteVector),因此不需要完全使用 byteArray。从 byteVector 开始,用它做我的代码。
猜你喜欢
  • 1970-01-01
  • 2014-05-03
  • 2019-12-15
  • 2020-11-04
  • 2021-12-02
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多