#include #include #include #include "hx_ringbuffer.h" int by_ringbuf_init(by_ringbuf_t *rb, int size) { #ifdef BY_RINGBUF_STATIC_ALLOC // 使用预先分配的内存 static uint8_t static_buffer[BY_RINGBUF_STATIC_BUFFER_SIZE]; if (size > sizeof(static_buffer)) { return -1; // 预先分配的内存不足 } rb->buffer = static_buffer; #else // 使用 malloc 动态分配内存 rb->buffer = (uint8_t *)malloc(size); if (rb->buffer == NULL) { return -1; // 分配内存失败 } #endif rb->size = size; rb->head = 0; rb->tail = 0; rb->is_full = false; return 0; } void by_ringbuf_free(by_ringbuf_t *rb) { #ifndef BY_RINGBUF_STATIC_ALLOC // 只有使用 malloc 分配的内存才需要释放 if (rb->buffer) { free(rb->buffer); rb->buffer = NULL; } #endif rb->size = 0; rb->head = 0; rb->tail = 0; rb->is_full = false; } int by_ringbuf_append(by_ringbuf_t *rb, const uint8_t *data, int len) { if (len > by_ringbuf_available_space(rb)) { return -1; // 缓冲区空间不足 } for (int i = 0; i < len; i++) { rb->buffer[rb->head] = data[i]; rb->head = (rb->head + 1) % rb->size; if (rb->head == rb->tail) { rb->is_full = true; } } return len; } int by_ringbuf_pop(by_ringbuf_t *rb, uint8_t *data, int len) { if (len > by_ringbuf_available_data(rb)) { return -1; // 数据不足 } for (int i = 0; i < len; i++) { data[i] = rb->buffer[rb->tail]; rb->tail = (rb->tail + 1) % rb->size; rb->is_full = false; } return len; } int by_ringbuf_find(by_ringbuf_t *rb, const uint8_t *pattern, int pattern_len) { int available_data = by_ringbuf_available_data(rb); if (pattern_len > available_data) { return -1; // 数据不足,无法查找 } for (int i = 0; i <= available_data - pattern_len; i++) { int match = 1; for (int j = 0; j < pattern_len; j++) { int index = (rb->tail + i + j) % rb->size; if (rb->buffer[index] != pattern[j]) { match = 0; break; } } if (match) { return i; // 返回匹配的起始位置 } } return -1; // 未找到匹配 } int by_ringbuf_available_data(by_ringbuf_t *rb) { if (rb->is_full) { return rb->size; } return (rb->head - rb->tail + rb->size) % rb->size; } int by_ringbuf_available_space(by_ringbuf_t *rb) { return rb->size - by_ringbuf_available_data(rb); } // 调试函数:打印环形缓冲区中的数据及其序号 void by_ringbuf_debug_print(by_ringbuf_t *rb) { int available_data = by_ringbuf_available_data(rb); if (available_data == 0) { printf("Ring buffer is empty.\n"); return; } printf("Ring buffer content (size: %d, available data: %d):\n", rb->size, available_data); for (int i = 0; i < available_data; i++) { int index = (rb->tail + i) % rb->size; printf("[%04d] 0x%02X\n", i, rb->buffer[index]); } }