123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- /*
- * binary_buf是二进制缓存
- * 这里用字符串,来存储雷达的通信消息的原始数据
- * Binary_buf 的内容格式:消息类型 + 消息数据
- *
- * 例如思科的雷达的消息类型
- * ready->ready->start->data->data->data->stop->ready->ready
- *
- * 提供了 is_equal 系列的函数,来进行判断前面的消息类型
- *
- * 注意了:m_buf是中间可以允许有‘\0’的,不是单纯的字符串格式
- * 末尾也不一定是‘\0’
- */
- #include "binary_buf.h"
- #include <string>
- #include <string.h>
- Binary_buf::Binary_buf() {
- mp_buf = NULL;
- m_length = 0;
- }
- Binary_buf::Binary_buf(const Binary_buf &other) {
- mp_buf = NULL;
- m_length = 0;
- if (other.m_length > 0 && other.mp_buf != NULL) {
- mp_buf = (char *) malloc(other.m_length);
- memcpy(mp_buf, other.mp_buf, other.m_length);
- m_length = other.m_length;
- }
- }
- Binary_buf::~Binary_buf() {
- if (mp_buf) {
- free(mp_buf);
- mp_buf = NULL;
- }
- m_length = 0;
- // std::cout << "Binary_buf::~Binary_buf()" << std::endl;
- }
- //使用参数构造,深拷贝,len为0时,使用strlen(buf),不存储结束符'\0'
- Binary_buf::Binary_buf(const char *p_buf, int len) {
- mp_buf = NULL;
- m_length = 0;
- if (p_buf != NULL) {
- if (len <= 0) {
- len = strlen(p_buf);
- }
- mp_buf = (char *) malloc(len);
- memcpy(mp_buf, p_buf, len);
- m_length = len;
- }
- }
- //使用参数构造,深拷贝,len为0时,使用strlen(buf),不存储结束符'\0'
- Binary_buf::Binary_buf(char *p_buf, int len) {
- mp_buf = NULL;
- m_length = 0;
- if (p_buf != NULL) {
- if (len <= 0) {
- len = strlen(p_buf);
- }
- mp_buf = (char *) malloc(len);
- memcpy(mp_buf, p_buf, len);
- m_length = len;
- }
- }
- //重载=,深拷贝,
- Binary_buf &Binary_buf::operator=(const Binary_buf &other) {
- clear();
- if (other.m_length > 0 && other.mp_buf != NULL) {
- mp_buf = (char *) malloc(other.m_length);
- memcpy(mp_buf, other.mp_buf, other.m_length);
- m_length = other.m_length;
- }
- return *this;
- }
- //重载=,深拷贝,使用strlen(buf),不存储结束符'\0'
- Binary_buf &Binary_buf::operator=(const char *p_buf) {
- clear();
- if (p_buf != NULL) {
- int len = strlen(p_buf);
- mp_buf = (char *) malloc(len);
- memcpy(mp_buf, p_buf, len);
- m_length = len;
- }
- return *this;
- }
- //重载+,other追加在this的后面,
- Binary_buf &Binary_buf::operator+(Binary_buf &other) {
- if (other.mp_buf != NULL && other.m_length > 0) {
- int t_length_total = m_length + other.m_length;
- char *tp_buf_total = (char *) malloc(t_length_total);
- memcpy(tp_buf_total, mp_buf, m_length);
- memcpy(tp_buf_total + m_length, other.mp_buf, other.m_length);
- free(mp_buf);
- mp_buf = tp_buf_total;
- m_length = t_length_total;
- }
- return *this;
- }
- //重载+,追加在this的后面,使用strlen(buf),不存储结束符'\0'
- Binary_buf &Binary_buf::operator+(const char *p_buf) {
- if (p_buf != NULL) {
- int t_length_back = strlen(p_buf);
- int t_length_total = m_length + t_length_back;
- char *tp_buf_total = (char *) malloc(t_length_total);
- memcpy(tp_buf_total, mp_buf, m_length);
- memcpy(tp_buf_total + m_length, p_buf, t_length_back);
- free(mp_buf);
- mp_buf = tp_buf_total;
- m_length = t_length_total;
- }
- return *this;
- }
- //重载[],允许直接使用数组的形式,直接访问buf的内存。注意,n值必须在0~m_length之间,
- char &Binary_buf::operator[](int n) {
- if (n >= 0 && n < m_length) {
- return mp_buf[n];
- } else {
- throw (n);
- }
- }
- //判空
- bool Binary_buf::is_empty() {
- if (mp_buf != NULL && m_length > 0) {
- return false;
- } else {
- return true;
- }
- }
- //清空
- void Binary_buf::clear() {
- if (mp_buf) {
- free(mp_buf);
- mp_buf = NULL;
- }
- m_length = 0;
- }
- //比较前面部分的buf是否相等,使用 other.m_length 为标准
- bool Binary_buf::is_equal_front(const Binary_buf &other) {
- if (other.mp_buf == NULL || other.m_length <= 0) {
- if (mp_buf == NULL || m_length <= 0) {
- return true;
- } else {
- return false;
- }
- } else {
- if (mp_buf != NULL && m_length > 0) {
- if (other.m_length > m_length) {
- return false;
- }
- return (strncmp((const char *) mp_buf, other.mp_buf, other.m_length) == 0);
- } else {
- return false;
- }
- }
- }
- //比较前面部分的buf是否相等,len为0时,使用strlen(buf)为标准,不比较结束符'\0'
- bool Binary_buf::is_equal_front(const char *p_buf, int len) {
- if (p_buf == NULL) {
- if (mp_buf == NULL || m_length <= 0) {
- return true;
- } else {
- return false;
- }
- } else {
- if (mp_buf != NULL && m_length > 0) {
- if (len == 0) {
- len = strlen(p_buf);
- }
- if (len > m_length) {
- return false;
- }
- return (strncmp((const char *) mp_buf, p_buf, len) == 0);
- } else {
- return false;
- }
- }
- }
- //比较的buf是否全部相等,
- bool Binary_buf::is_equal_all(const Binary_buf &other) {
- if (other.mp_buf == NULL || other.m_length <= 0) {
- if (mp_buf == NULL || m_length <= 0) {
- return true;
- } else {
- return false;
- }
- } else {
- if (mp_buf != NULL && m_length > 0) {
- if (other.m_length != m_length) {
- return false;
- }
- return (strncmp((const char *) mp_buf, other.mp_buf, other.m_length) == 0);
- } else {
- return false;
- }
- }
- }
- //比较的buf是否全部相等,不比较结束符'\0'
- bool Binary_buf::is_equal_all(const char *p_buf) {
- if (p_buf == NULL) {
- if (mp_buf == NULL || m_length <= 0) {
- return true;
- } else {
- return false;
- }
- } else {
- if (mp_buf != NULL && m_length > 0) {
- int len = strlen(p_buf);
- if (len != m_length) {
- return false;
- }
- return (strncmp((const char *) mp_buf, p_buf, len) == 0);
- } else {
- return false;
- }
- }
- }
- char *Binary_buf::get_buf() const {
- return mp_buf;
- }
- int Binary_buf::get_length() const {
- return m_length;
- }
|