- ROS-I simple_message 源码分析:ByteAr
- ROS-I simple_message 源码分析:Messag
- ROS-I simple_message 源码分析:SmplMs
- ROS-I simple_message 源码分析:Messag
- ROS-I simple_message 源码分析:JointT
- ROS-I simple_message 源码分析:JointT
- ROS-I simple_message 源码分析:JointT
- ROS-I simple_message 源码分析:TypedM
- ROS-I simple_message 源码分析:RobotS
- ROS-I simple_message 源码分析:JointT
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<char> & 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<char> buffer_;
std::vector<char> 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方法则是基于该方法卸载不同的数据类型,此处就不再列举。
网友评论