|
@@ -0,0 +1,264 @@
|
|
|
+
|
|
|
+/*
|
|
|
+ * 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;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|