ROS-I simple_message 源码分析:ByteArray

byte array封装了一个由STL deque实现的动态数组(比如char类型的)。该类提供了一些方法,用于加载不同的类型至byte array,或者从byte array卸载出不同的类型。

namespace industrial
{
namespace simple_serialize
{
class SimpleSerialize;
}
}

namespace industrial
{
namespace byte_array
{

class ByteArray
{
public:

  friend class SimpleSerialize;

  ByteArray(void);
  ~ByteArray(void);

  //清空内部缓冲区
  void init();
  
  //从char*指针初始化(拷贝)一个byte array,最大字节长度为byte_size
  bool init(const char* buffer, const industrial::shared_types::shared_int byte_size);
  void copyFrom(ByteArray & buffer);
  void copyTo(std::vector & out);
  bool load(industrial::shared_types::shared_bool value);
  bool load(industrial::shared_types::shared_real value);
  bool load(industrial::shared_types::shared_int value);
  bool load(industrial::simple_serialize::SimpleSerialize &value);
  bool load(ByteArray &value);
  bool load(void* value, const industrial::shared_types::shared_int byte_size);
  bool unload(industrial::shared_types::shared_bool &value);
  bool unload(industrial::shared_types::shared_real &value);
  bool unload(industrial::shared_types::shared_int &value);
  bool unload(industrial::simple_serialize::SimpleSerialize &value);
  bool unload(ByteArray &value, const industrial::shared_types::shared_int byte_size);
  bool unload(void* value, const industrial::shared_types::shared_int byteSize);
  bool unloadFront(industrial::shared_types::shared_real &value);
  bool unloadFront(industrial::shared_types::shared_int &value);
  bool unloadFront(void* value, const industrial::shared_types::shared_int byteSize);

  char* getRawDataPtr();
  unsigned int getBufferSize();
  unsigned int getMaxBufferSize();
  static bool isByteSwapEnabled();

private:
  // 内部数据缓冲区
  std::deque buffer_;
  std::vector getRawDataPtr_buffer_;

};

} // namespace industrial
} // namespace byte_array

选取比较重要的几个方法来解析:

bool init(const char* buffer, const industrial::shared_types::shared_int byte_size);

这个方法的参数是 char* 指针和待拷贝字节数目 byte_size ,首先会检查byte_size是否超过ByteArray内部的deque可存放最大字节数,如果没有超过,则将 char* 转为 void*,传递给load方法:

bool load(void* value, const industrial::shared_types::shared_int byte_size);

这个load方法会将 void* 转为 char* 调用deque的insert在内部缓冲区后面添加指针指向的数据,这个操作就称为加载,可以理解为存储外部数据至ByteArray。其余的load方法则是基于该方法加载不同数据类型至缓冲区:

// 从一个bool类型的变量拷贝至缓冲区
bool load(industrial::shared_types::shared_bool value);
// 从一个real类型的变量拷贝至缓冲区
bool load(industrial::shared_types::shared_real value);
// 从一个int类型的变量拷贝至缓冲区
bool load(industrial::shared_types::shared_int value);
// 从SimpleSerialize对象拷贝至本对象缓冲区
bool load(industrial::simple_serialize::SimpleSerialize &value);
// 从另一个ByteArray对象内部缓冲区拷贝至本对象缓冲区
bool load(ByteArray &value);

这里提一下SimpleSerialize,该类是一个纯虚类,定义了load和unload接口,需用户继承该类,实现加载本类的数据至缓冲区,或从缓冲区卸载数据至本类。

virtual bool load(industrial::byte_array::ByteArray *buffer)=0;
virtual bool unload(industrial::byte_array::ByteArray *buffer)=0;

最后看看unload方法做了什么:

bool unload(void* value, const industrial::shared_types::shared_int byteSize);

unload方法的功能是从内部缓冲区的末尾拷贝长度byteSize的数据至value指向的外部数据,并从尾部删除(erase)掉这一部分数据,这个操作就叫做卸载,可以理解为还原ByteArray数据至外部对象。其余的unload方法则是基于该方法卸载不同的数据类型,此处就不再列举。

你可能感兴趣的:(ROS-I simple_message 源码分析:ByteArray)