优化websocket协议解析代码 2081/1 2081/head
author孙春阳 <snickersun@163.com>
Fri, 15 Aug 2025 02:43:39 +0000 (10:43 +0800)
committer孙春阳 <snickersun@163.com>
Fri, 15 Aug 2025 02:43:39 +0000 (10:43 +0800)
解决已经无数据但是还是完成解包的bug

code/sdk/drivers/peripheral/slip/cat1Service/websocket_parser.cpp
test_ws_parser/Makefile
test_ws_parser/data1.hex [new file with mode: 0644]
test_ws_parser/data2.hex [new file with mode: 0644]
test_ws_parser/websocket_parser_standalone.cpp
test_ws_parser/websocket_parser_test.cpp [new file with mode: 0644]
test_ws_parser/websocket_simple_analysis.json
test_ws_parser/websocket_simple_analysis.py
test_ws_parser/websocket_test [new file with mode: 0644]

index aa25914..889c0f1 100644 (file)
@@ -198,7 +198,7 @@ int ws_parse_byte(ws_parser_t* parser, uint8_t byte) {
             }
 
             // 检查RSV位是否都为0(根据RFC6455规范)
-            if (!(parser->header.fin == 1 && parser->header.rsv1 == 0 && parser->header.rsv2 == 0 && parser->header.rsv3 == 0)) 
+            if (!(parser->header.rsv1 == 0 && parser->header.rsv2 == 0 && parser->header.rsv3 == 0)) 
             {
                 WS_LOGE("WS: Invalid RSV bits: %d%d%d", 
                     parser->header.rsv1, parser->header.rsv2, parser->header.rsv3);
@@ -312,11 +312,8 @@ int ws_parse_byte(ws_parser_t* parser, uint8_t byte) {
                 
                 if (parser->payload_remaining == 0) {
                     // 计算16位长度
-                    uint16_t _payload_len = (uint16_t)(len_bytes[0] <<8 ) + len_bytes[1];
-                    printf("len_bytes[0] = %d, len_bytes[1] = %d\n ,payload_len = %d\n", len_bytes[0], len_bytes[1],_payload_len);
-
-                    parser->header.payload_len = _payload_len;
-                    parser->payload_remaining = _payload_len;
+                    parser->header.payload_len = (len_bytes[0] << 8) | len_bytes[1];
+                    parser->payload_remaining = parser->header.payload_len;
                     
                     WS_LOGI("WS: 16-bit payload length: %d bytes (0x%02X%02X)", 
                                   parser->header.payload_len, len_bytes[1], len_bytes[0]);
@@ -403,7 +400,7 @@ int ws_parse_byte(ws_parser_t* parser, uint8_t byte) {
                     if (parser->header.mask) {
                         WS_LOGI("WS: Moving to READ_MASK state");
                         parser->state = WS_STATE_READ_MASK;
-                        return 1;
+                        return 0;
                     } else {
                         if (parser->payload_remaining == 0) {
                             WS_LOGI("WS: Zero payload, moving to COMPLETE state");
@@ -514,19 +511,18 @@ int ws_parse_stream(ws_parser_t* parser, const uint8_t* data, size_t len) {
     
     for (size_t i = 0; i < len; i++) {
         int result = ws_parse_byte(parser, data[i]);
+        total_processed = i + 1; // 始终统计已消费字节数
         
         if (result == 1) {
             // 帧解析完成
             WS_LOGI("WS: Complete frame parsed (%zu bytes total) opcode: %d, payload_len: %llu", 
                     parser->buffer_pos, parser->header.opcode, (unsigned long long)parser->header.payload_len);
-            total_processed = i + 1;
             break;
         } else if (result == -1) {
             // 解析错误
             WS_LOGE("WS: Parsing error at byte %zu", i);
             ws_parser_reset(parser);
-        // return -1;
-            total_processed = i + 1;
+            break; // 让上层根据 total_processed 前进
         }
         // result == 0 继续解析
     }
@@ -628,330 +624,3 @@ void ws_parser_destroy(ws_parser_t* parser) {
 #ifdef __cplusplus
 }
 #endif
-#if 0
-// 多包拆解测试函数
-void test_multiple_frames() {
-    printf("\n=== Multiple WebSocket Frames Test ===\n");
-    
-    // 测试数据:包含多个WebSocket帧
-    uint8_t test_data[] = {
-        // 第一个帧:5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x5F, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第二个帧:82 48 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E8 BF 99 E6 A0 B7 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x48, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE8, 0xBF,
-        0x99, 0xE6, 0xA0, 0xB7, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A,
-        0x22, 0x22, 0x2C, 0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F,
-        0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第三个帧:82 45 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E7 9A 84 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x45, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 74, 0x22, 0x3A, 0x22, 0xE7, 0x9A,
-        0x84, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A, 0x22, 0x22, 0x2C,
-        0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x74, 0x65,
-        0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第四个帧:82 48 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E6 95 B0 E5 AD 97 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x48, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE6, 0x95,
-        0xB0, 0xE5, 0xAD, 0x97, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A,
-        0x22, 0x22, 0x2C, 0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F,
-        0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第五个帧:82 48 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E7 BB 84 E5 90 88 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x48, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE7, 0xBB,
-        0x84, 0xE5, 0x90, 0x88, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A,
-        0x22, 0x22, 0x2C, 0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F,
-        0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第六个帧:82 45 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E5 91 A2 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x45, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE5, 0x91,
-        0xA2, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A, 0x22, 0x22, 0x2C,
-        0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x74, 0x65,
-        0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第七个帧:82 45 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E3 80 82 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x45, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE3, 0x80,
-        0x82, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A, 0x22, 0x22, 0x2C,
-        0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x74, 0x65,
-        0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第八个帧:82 45 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E4 BD A0 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x45, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE4, 0xBD,
-        0xA0, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A, 0x22, 0x22, 0x2C,
-        0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x74, 0x65,
-        0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第九个帧:82 45 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E8 83 BD 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x45, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE8, 0x83,
-        0xBD, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A, 0x22, 0x22, 0x2C,
-        0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x74, 0x65,
-        0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第十个帧:82 48 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E8 AF B4 E8 AF B4 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x48, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE8, 0xAF,
-        0xB4, 0xE8, 0xAF, 0xB4, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A,
-        0x22, 0x22, 0x2C, 0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F,
-        0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第十一个帧:82 45 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E8 BF 99 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x45, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE8, 0xBF,
-        0x99, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A, 0x22, 0x22, 0x2C,
-        0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x74, 0x65,
-        0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第十二个帧:82 48 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E5 87 A0 E4 B8 AA 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x48, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE5, 0x87,
-        0xA0, 0xE4, 0xB8, 0xAA, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A,
-        0x22, 0x22, 0x2C, 0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F,
-        0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第十三个帧:82 48 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E6 95 B0 E5 AD 97 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x48, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE6, 0x95,
-        0xB0, 0xE5, 0xAD, 0x97, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A,
-        0x22, 0x22, 0x2C, 0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F,
-        0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第十四个帧:82 45 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E6 98 AF 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x45, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE6, 0x98,
-        0xAF, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A, 0x22, 0x22, 0x2C,
-        0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x74, 0x65,
-        0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第十五个帧:82 45 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E5 9C A8 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x45, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE5, 0x9C,
-        0xA8, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A, 0x22, 0x22, 0x2C,
-        0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x74, 0x65,
-        0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D
-    };
-    
-    size_t test_data_len = sizeof(test_data);
-    
-    printf("Test data length: %zu bytes\n", test_data_len);
-    printf("Test data (hex): ");
-    for (size_t i = 0; i < test_data_len; i++) {
-        printf("%02X ", test_data[i]);
-        if ((i + 1) % 16 == 0) printf("\n                    ");
-    }
-    printf("\n");
-    
-    // 创建解析器
-    ws_parser_t* parser = ws_parser_init();
-    if (!parser) {
-        printf("Failed to create parser\n");
-        return;
-    }
-    
-    // 多包拆解测试
-    printf("\n=== Starting Multi-Frame Parsing ===\n");
-    
-    size_t offset = 0;
-    int frame_count = 0;
-    
-    while (offset < test_data_len) {
-        printf("\n--- Frame %d ---\n", frame_count + 1);
-        printf("Remaining data: %zu bytes\n", test_data_len - offset);
-        
-        // 解析当前帧
-        int result = ws_parse_stream(parser, test_data + offset, test_data_len - offset);
-        ws_parse_state_t ws_state = ws_parser_get_state(parser);
-        printf("ws_state: %d,result: %d\n", ws_state,result);
-        if (result > 0 && ws_state == WS_STATE_COMPLETE) {
-            frame_count++;
-            printf("Frame %d parsed successfully, consumed %d bytes\n", frame_count, result);
-            
-            const ws_header_t* header = ws_get_header(parser);
-            if (header) {
-                printf("Frame header:\n");
-                printf("  FIN: %d\n", header->fin);
-                printf("  RSV: %d%d%d\n", header->rsv1, header->rsv2, header->rsv3);
-                printf("  Opcode: 0x%02X\n", header->opcode);
-                printf("  Mask: %d\n", header->mask);
-                printf("  Payload length: %llu\n", (unsigned long long)header->payload_len);
-                
-                if (header->mask) {
-                    printf("  Mask key: 0x%02X%02X%02X%02X\n", 
-                        header->mask_key[0], header->mask_key[1], 
-                        header->mask_key[2], header->mask_key[3]);
-                }
-            }
-            
-            const uint8_t* payload = ws_get_payload(parser);
-            size_t payload_len = ws_get_payload_length(parser);
-            
-            if (payload && payload_len > 0) {
-                printf("Payload data:\n");
-                printf("  Length: %zu bytes\n", payload_len);
-                printf("  Hex: ");
-                for (size_t i = 0; i < payload_len && i < 32; i++) {
-                    printf("%02X ", payload[i]);
-                    if ((i + 1) % 16 == 0) printf("\n        ");
-                }
-                if (payload_len > 32) printf("...");
-                printf("\n");
-                
-                printf("  ASCII: ");
-                for (size_t i = 0; i < payload_len && i < 64; i++) {
-                    if (payload[i] >= 32 && payload[i] <= 126) {
-                        printf("%c", payload[i]);
-                    } else {
-                        printf(".");
-                    }
-                }
-                if (payload_len > 64) printf("...");
-                printf("\n");
-            }
-            
-            
-            
-            // 重置解析器状态,准备解析下一个帧
-            ws_parser_reset(parser);
-            
-        } else if (result > 0 && ws_state != WS_STATE_ERROR) {
-            printf("Parser state: %d reset \n", ws_parser_get_state(parser));
-            // 重置解析器状态,准备解析下一个帧
-            ws_parser_reset(parser);
-        } else {
-            printf("Incomplete frame, need more data\n");
-            // printf("Parse error at offset %zu\n", offset);
-            // printf("Parser state: %d\n", ws_parser_get_state(parser));
-        }
-
-        // 移动到下一个帧
-        offset += result;
-        // 添加安全检查
-        if (offset >= test_data_len) {
-            printf("Reached end of data\n");
-            break;
-        }
-    }
-    
-    printf("\n=== Multi-Frame Parsing Complete ===\n");
-    printf("Total frames parsed: %d\n", frame_count);
-    printf("Total bytes processed: %zu\n", offset);
-    printf("Remaining bytes: %zu\n", test_data_len - offset);
-    
-    // 清理
-    ws_parser_destroy(parser);
-}
-
-// 单帧测试函数(保留原有功能)
-void test_single_frame() {
-    printf("\n=== Single WebSocket Frame Test ===\n");
-    
-    // 测试数据:82 48 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E8 BF 99 E6 A0 B7 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-    uint8_t test_data[] = {
-        0x82, 0x48, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE8, 0xBF,
-        0x99, 0xE6, 0xA0, 0xB7, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A,
-        0x22, 0x22, 0x2C, 0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F,
-        0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D
-    };
-    
-    size_t test_data_len = sizeof(test_data);
-    
-    printf("Test data length: %zu bytes\n", test_data_len);
-    printf("Test data (hex): ");
-    for (size_t i = 0; i < test_data_len; i++) {
-        printf("%02X ", test_data[i]);
-        if ((i + 1) % 16 == 0) printf("\n                    ");
-    }
-    printf("\n");
-    
-    // 创建解析器
-    ws_parser_t* parser = ws_parser_init();
-    if (!parser) {
-        printf("Failed to create parser\n");
-        return;
-    }
-    
-    // 解析数据
-    int result = ws_parse_stream(parser, test_data, test_data_len);
-    
-    if (result > 0) {
-        printf("\n=== Parse Result ===\n");
-        printf("Parsed bytes: %d\n", result);
-        
-        const ws_header_t* header = ws_get_header(parser);
-        if (header) {
-            printf("Frame header:\n");
-            printf("  FIN: %d\n", header->fin);
-            printf("  RSV: %d%d%d\n", header->rsv1, header->rsv2, header->rsv3);
-            printf("  Opcode: 0x%02X\n", header->opcode);
-            printf("  Mask: %d\n", header->mask);
-            printf("  Payload length: %llu\n", (unsigned long long)header->payload_len);
-            
-            if (header->mask) {
-                printf("  Mask key: 0x%02X%02X%02X%02X\n", 
-                    header->mask_key[0], header->mask_key[1], 
-                    header->mask_key[2], header->mask_key[3]);
-            }
-        }
-        
-        const uint8_t* payload = ws_get_payload(parser);
-        size_t payload_len = ws_get_payload_length(parser);
-        
-        if (payload && payload_len > 0) {
-            printf("\nPayload data:\n");
-            printf("  Length: %zu bytes\n", payload_len);
-            printf("  Hex: ");
-            for (size_t i = 0; i < payload_len && i < 64; i++) {
-                printf("%02X ", payload[i]);
-                if ((i + 1) % 16 == 0) printf("\n        ");
-            }
-            if (payload_len > 64) printf("...");
-            printf("\n");
-            
-            printf("  ASCII: ");
-            for (size_t i = 0; i < payload_len && i < 64; i++) {
-                if (payload[i] >= 32 && payload[i] <= 126) {
-                    printf("%c", payload[i]);
-                } else {
-                    printf(".");
-                }
-            }
-            if (payload_len > 64) printf("...");
-            printf("\n");
-        }
-        
-        printf("\nParser state: %d\n", ws_parser_get_state(parser));
-        
-    } else if (result == 0) {
-        printf("Incomplete frame, need more data\n");
-        printf("Parser state: %d\n", ws_parser_get_state(parser));
-    } else {
-        printf("Parse error\n");
-        printf("Parser state: %d\n", ws_parser_get_state(parser));
-    }
-    
-    // 清理
-    ws_parser_destroy(parser);
-}
-
-int main() {
-    printf("WebSocket Parser Standalone Test\n");
-    printf("================================\n");
-    
-    // 测试单帧解析
-    test_single_frame();
-    
-    // 测试多帧解析
-    test_multiple_frames();
-    
-    printf("\nAll tests completed.\n");
-    return 0;
-}
-
-#endif
\ No newline at end of file
index 99a8e6d..89d1c98 100644 (file)
@@ -1,7 +1,7 @@
 CC = gcc
 CFLAGS = -Wall -Wextra -std=c99 -O2
 TARGET = websocket_test
-SOURCE = websocket_parser_standalone.cpp
+SOURCE = websocket_parser_test.cpp
 
 # 默认目标
 all: $(TARGET)
diff --git a/test_ws_parser/data1.hex b/test_ws_parser/data1.hex
new file mode 100644 (file)
index 0000000..2e43252
--- /dev/null
@@ -0,0 +1,62 @@
+65 1C CA 5A A5 1E C3 CA BA E2 2D 0A 3A FF 41 22 
+2A 59 46 AF 61 2A 48 AA 02 D2 51 24 64 29 81 A7 
+21 B6 64 FD 88 4B 8D 77 70 F9 11 CC A4 19 12 43 
+01 A8 9F 56 C0 2C 0C 64 0B A1 0D CA F6 1E EA 25 
+D9 4B 8A 04 DE F2 B5 90 78 32 CE 7E E3 45 97 EE 
+02 BE 56 D8 29 BF BF FF D5 36 7F AD A7 45 2F 1F 
+3D DE A4 5B 57 A3 77 4A 09 8A EA CF A0 79 D6 BD 
+DF 6E FE A9 B8 D6 AD BF FE 47 FF A3 EF 5D 28 CE 
+68 A9 C9 C0 B9 A5 17 53 08 3A F0 44 FF F3 48 C4 
+74 19 42 42 54 14 DA 4A C8 21 E7 33 52 38 7A 7C 
+A6 30 45 79 8F 24 04 1D 06 8C DE 22 5D 65 6B A8 
+F6 31 AB 75 84 E9 F6 35 83 61 98 E7 A4 D3 0F 3F 
+51 E9 89 67 91 59 98 6A B7 11 80 85 56 55 61 42 
+82 E1 AD 38 BB 29 57 5B E9 F3 B7 A3 5A 75 7F 59 
+7A 00 8B 23 20 E9 50 03 00 63 95 BC 73 95 BA AD 
+46 1C 10 A8 C7 36 FD 8E B1 64 54 A9 46 54 CA 4E 
+46 6A BA DA 45 99 2F A7 A5 29 9F 74 06 A3 25 E5 
+A3 D5 88 CF 2E 7D 4B AF F3 18 C5 52 FF F3 48 C4 
+92 15 A0 56 44 0C 7E 18 24 95 AF 9B 44 77 47 5B 
+2D 55 6E 6B A5 F5 2A D5 5B CD 65 23 5F 6A 7B 2A 
+2E E5 4B 65 5D 27 AD 48 A5 38 40 E2 9E 76 59 D8 
+AE 7F CF BE 61 13 30 4C 17 55 4C 41 4D 45 55 55 
+00 6A 96 BE AE EA 82 65 89 30 C1 B8 2B 24 1D 9D 
+1A 58 F5 68 73 4B 56 71 C4 45 A7 98 54 6E 22 5A 
+14 05 66 A7 4C 3D 86 96 02 F4 B6 E6 87 14 05 88 
+B7 2A 45 A4 85 69 DF AD D6 50 7A C5 0E 41 5A 9B 
+D7 B2 A6 38 59 02 CD 40 A9 9B 99 17 FF F3 48 C4 
+BE 1A DB 6E 24 4A 60 C4 7D 3A A0 AC 19 40 B0 E5 
+4C 41 4D 45 33 2E 31 30 30 55 55 55 55 55 55 55 
+55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 
+55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 
+55 55 55 55 55 55 55 55 55 55 55 55 82 7E 01 60 
+55 55 04 A7 36 8D C9 65 92 BC 48 8A EE 0E 89 4B 
+59 88 95 3A C5 15 53 CE D2 8A 9E 74 F1 54 73 C5 
+91 FA B2 28 2A 59 77 E5 8A AD C7 90 CF F6 11 45 
+F1 29 61 E7 49 16 5B 8E FA 9F 4D 87 4B 79 55 B9 
+FF F3 48 C4 CF 14 A0 12 31 94 18 44 00 FF FF E4 
+A5 76 1D 4A 4C 41 4D 45 33 2E 31 30 30 AA AA AA 
+AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
+AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
+AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
+AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
+AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
+AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
+AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
+FF F3 48 C4 C1 11 28 06 22 5E 00 46 00 AA AA AA 
+AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
+AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
+AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
+AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
+AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
+AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
+AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
+AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
+81 72 7B 22 68 65 61 64 65 72 22 3A 7B 22 65 76 
+65 6E 74 22 3A 22 45 6E 64 53 79 6E 74 68 65 73 
+69 73 22 2C 22 6D 73 67 22 3A 22 73 75 63 63 65 
+73 73 22 2C 22 73 74 61 74 75 73 22 3A 32 30 30 
+30 30 30 30 30 2C 22 74 61 73 6B 5F 69 64 22 3A 
+22 63 66 38 62 32 65 63 39 61 33 34 39 65 35 30 
+31 61 36 33 61 36 33 30 32 38 62 61 38 36 38 31 
+34 22 7D 7D
\ No newline at end of file
diff --git a/test_ws_parser/data2.hex b/test_ws_parser/data2.hex
new file mode 100644 (file)
index 0000000..f4ba1ec
--- /dev/null
@@ -0,0 +1,64 @@
+74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 
+63 6F 6E 74 65 6E 74 22 3A 22 E7 AC 91 E7 9D 80 
+22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 
+72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 
+74 22 3A 22 22 7D 82 48 7B 22 74 79 70 65 22 3A 
+22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 
+74 22 3A 22 E5 9B 9E E5 A4 8D 22 2C 22 74 61 73 
+6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 
+69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D 
+82 47 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 
+65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 EF BC 
+9A 5C 22 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 
+22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 
+74 65 6E 74 22 3A 22 22 7D 82 48 7B 22 74 79 70 
+65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 
+74 65 6E 74 22 3A 22 E5 A5 BD E7 9A 84 22 2C 22 
+74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 
+73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 
+22 22 7D 82 45 7B 22 74 79 70 65 22 3A 22 6D 69 
+64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 
+22 EF BC 8C 22 2C 22 74 61 73 6B 5F 69 64 22 3A 
+22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 
+6E 74 65 6E 74 22 3A 22 22 7D 82 48 7B 22 74 79 
+70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 
+6E 74 65 6E 74 22 3A 22 E5 A6 88 E5 A6 88 22 2C 
+22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 
+61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 
+3A 22 22 7D 82 4B 7B 22 74 79 70 65 22 3A 22 6D 
+69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 
+3A 22 E3 80 82 5C 22 5C 6E 5C 6E 22 2C 22 74 61 
+73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 
+6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 
+7D 82 45 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 
+6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E5 
+88 9A 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 
+2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 
+65 6E 74 22 3A 22 22 7D 82 48 7B 22 74 79 70 65 
+22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 
+65 6E 74 22 3A 22 E6 94 BE E4 B8 8B 22 2C 22 74 
+61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 
+6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 
+22 7D 82 48 7B 22 74 79 70 65 22 3A 22 6D 69 64 
+64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 
+E6 89 8B E6 9C BA 22 2C 22 74 61 73 6B 5F 69 64 
+22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 
+63 6F 6E 74 65 6E 74 22 3A 22 22 7D 82 45 7B 22 
+74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 
+63 6F 6E 74 65 6E 74 22 3A 22 EF BC 8C 22 2C 22 
+74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 
+73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 
+22 22 7D 82 45 7B 22 74 79 70 65 22 3A 22 6D 69 
+64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 
+22 E9 97 A8 22 2C 22 74 61 73 6B 5F 69 64 22 3A 
+22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 
+6E 74 65 6E 74 22 3A 22 22 7D 82 45 7B 22 74 79 
+70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 
+6E 74 65 6E 74 22 3A 22 E9 93 83 22 2C 22 74 61 
+73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 
+6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 
+7D 82 48 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 
+6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E5 
+93 8D E4 BA 86 22 2C 22 74 61 73 6B 5F 69 64 22 
+3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 
+6F 6E 74 65 6E 74 22 3A 22 22 7D 82 45 7B 22 74 
\ No newline at end of file
index c02304b..0cc9f8c 100644 (file)
@@ -198,7 +198,7 @@ int ws_parse_byte(ws_parser_t* parser, uint8_t byte) {
             }
 
             // 检查RSV位是否都为0(根据RFC6455规范)
-            if (!(parser->header.fin == 1 && parser->header.rsv1 == 0 && parser->header.rsv2 == 0 && parser->header.rsv3 == 0)) 
+            if (!(parser->header.rsv1 == 0 && parser->header.rsv2 == 0 && parser->header.rsv3 == 0)) 
             {
                 WS_LOGE("WS: Invalid RSV bits: %d%d%d", 
                     parser->header.rsv1, parser->header.rsv2, parser->header.rsv3);
@@ -399,7 +399,7 @@ int ws_parse_byte(ws_parser_t* parser, uint8_t byte) {
                     if (parser->header.mask) {
                         WS_LOGI("WS: Moving to READ_MASK state");
                         parser->state = WS_STATE_READ_MASK;
-                        return 1;
+                        return 0;
                     } else {
                         if (parser->payload_remaining == 0) {
                             WS_LOGI("WS: Zero payload, moving to COMPLETE state");
@@ -418,7 +418,16 @@ int ws_parse_byte(ws_parser_t* parser, uint8_t byte) {
             // 读取掩码密钥
             if (parser->mask_pos < 4) {
                 parser->header.mask_key[parser->mask_pos++] = byte;
-                
+                // 保存掩码字节到缓存
+            if (parser->buffer_pos < WS_BUFFER_SIZE) {
+                parser->buffer[parser->buffer_pos++] = byte;
+            } else {
+                parser->state = WS_STATE_ERROR;
+                WS_LOGI("WS: Buffer overflow in mask");
+                return -1;
+            }
+            
+            // 掩码密钥共4字节
                 if (parser->mask_pos == 4) {
                     WS_LOGI("WS: Mask key read complete: 0x%02X%02X%02X%02X", 
                         parser->header.mask_key[0], parser->header.mask_key[1], 
@@ -501,21 +510,20 @@ int ws_parse_stream(ws_parser_t* parser, const uint8_t* data, size_t len) {
     
     for (size_t i = 0; i < len; i++) {
         int result = ws_parse_byte(parser, data[i]);
+        total_processed = i + 1; // 始终统计已消费字节数
         
         if (result == 1) {
             // 帧解析完成
             WS_LOGI("WS: Complete frame parsed (%zu bytes total) opcode: %d, payload_len: %llu", 
                     parser->buffer_pos, parser->header.opcode, (unsigned long long)parser->header.payload_len);
-            total_processed = i + 1;
             break;
         } else if (result == -1) {
             // 解析错误
             WS_LOGE("WS: Parsing error at byte %zu", i);
             ws_parser_reset(parser);
-        // return -1;
-            total_processed = i + 1;
+            break; // 让上层根据 total_processed 前进
         }
-        // result == 0 继续解析
+        // result == 0 继续解析直到数据用尽
     }
     
     if (parser->state == WS_STATE_COMPLETE) {
@@ -553,7 +561,7 @@ const uint8_t* ws_get_payload(ws_parser_t* parser) {
     }
     
     // 计算载荷数据的起始位置
-    // 帧头:2字节(基本头部)
+    // 注意:当前实现仅将基本2字节头和负载写入缓冲,未写入扩展长度与掩码字节
     size_t header_size = 2;
     
     // 扩展长度字段
@@ -615,375 +623,3 @@ void ws_parser_destroy(ws_parser_t* parser) {
 #ifdef __cplusplus
 }
 #endif
-#if 1
-// 多包拆解测试函数
-void test_multiple_frames() {
-    printf("\n=== Multiple WebSocket Frames Test ===\n");
-    
-    // 测试数据:包含多个WebSocket帧
-    uint8_t test_data[] = {
-        // 第一个帧:5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x5F, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第二个帧:82 48 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E8 BF 99 E6 A0 B7 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x48, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE8, 0xBF,
-        0x99, 0xE6, 0xA0, 0xB7, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A,
-        0x22, 0x22, 0x2C, 0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F,
-        0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第三个帧:82 45 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E7 9A 84 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x45, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 74, 0x22, 0x3A, 0x22, 0xE7, 0x9A,
-        0x84, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A, 0x22, 0x22, 0x2C,
-        0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x74, 0x65,
-        0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第四个帧:82 48 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E6 95 B0 E5 AD 97 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x48, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE6, 0x95,
-        0xB0, 0xE5, 0xAD, 0x97, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A,
-        0x22, 0x22, 0x2C, 0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F,
-        0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第五个帧:82 48 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E7 BB 84 E5 90 88 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x48, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE7, 0xBB,
-        0x84, 0xE5, 0x90, 0x88, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A,
-        0x22, 0x22, 0x2C, 0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F,
-        0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第六个帧:82 45 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E5 91 A2 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x45, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE5, 0x91,
-        0xA2, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A, 0x22, 0x22, 0x2C,
-        0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x74, 0x65,
-        0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第七个帧:82 45 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E3 80 82 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x45, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE3, 0x80,
-        0x82, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A, 0x22, 0x22, 0x2C,
-        0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x74, 0x65,
-        0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第八个帧:82 45 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E4 BD A0 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x45, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE4, 0xBD,
-        0xA0, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A, 0x22, 0x22, 0x2C,
-        0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x74, 0x65,
-        0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第九个帧:82 45 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E8 83 BD 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x45, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE8, 0x83,
-        0xBD, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A, 0x22, 0x22, 0x2C,
-        0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x74, 0x65,
-        0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第十个帧:82 48 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E8 AF B4 E8 AF B4 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x48, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE8, 0xAF,
-        0xB4, 0xE8, 0xAF, 0xB4, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A,
-        0x22, 0x22, 0x2C, 0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F,
-        0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第十一个帧:82 45 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E8 BF 99 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x45, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE8, 0xBF,
-        0x99, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A, 0x22, 0x22, 0x2C,
-        0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x74, 0x65,
-        0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第十二个帧:82 48 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E5 87 A0 E4 B8 AA 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x48, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE5, 0x87,
-        0xA0, 0xE4, 0xB8, 0xAA, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A,
-        0x22, 0x22, 0x2C, 0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F,
-        0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第十三个帧:82 48 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E6 95 B0 E5 AD 97 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x48, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE6, 0x95,
-        0xB0, 0xE5, 0xAD, 0x97, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A,
-        0x22, 0x22, 0x2C, 0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F,
-        0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第十四个帧:82 45 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E6 98 AF 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x45, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE6, 0x98,
-        0xAF, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A, 0x22, 0x22, 0x2C,
-        0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x74, 0x65,
-        0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D,
-        
-        // 第十五个帧:82 45 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E5 9C A8 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-        0x82, 0x45, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-        0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE5, 0x9C,
-        0xA8, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A, 0x22, 0x22, 0x2C,
-        0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x74, 0x65,
-        0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D
-    };
-    
-    size_t test_data_len = sizeof(test_data);
-    
-    printf("Test data length: %zu bytes\n", test_data_len);
-    printf("Test data (hex): ");
-    for (size_t i = 0; i < test_data_len; i++) {
-        printf("%02X ", test_data[i]);
-        if ((i + 1) % 16 == 0) printf("\n                    ");
-    }
-    printf("\n");
-    
-    // 创建解析器
-    ws_parser_t* parser = ws_parser_init();
-    if (!parser) {
-        printf("Failed to create parser\n");
-        return;
-    }
-    
-    // 多包拆解测试
-    printf("\n=== Starting Multi-Frame Parsing ===\n");
-    
-    size_t offset = 0;
-    int frame_count = 0;
-    
-    while (offset < test_data_len) {
-        printf("\n--- Frame %d ---\n", frame_count + 1);
-        printf("Remaining data: %zu bytes\n", test_data_len - offset);
-        
-        // 解析当前帧
-        int result = ws_parse_stream(parser, test_data + offset, test_data_len - offset);
-        ws_parse_state_t ws_state = ws_parser_get_state(parser);
-        printf("ws_state: %d,result: %d\n", ws_state,result);
-        if (result > 0 && ws_state == WS_STATE_COMPLETE) {
-            frame_count++;
-            printf("Frame %d parsed successfully, consumed %d bytes\n", frame_count, result);
-            
-            const ws_header_t* header = ws_get_header(parser);
-            if (header) {
-                printf("Frame header:\n");
-                printf("  FIN: %d\n", header->fin);
-                printf("  RSV: %d%d%d\n", header->rsv1, header->rsv2, header->rsv3);
-                printf("  Opcode: 0x%02X\n", header->opcode);
-                printf("  Mask: %d\n", header->mask);
-                printf("  Payload length: %llu\n", (unsigned long long)header->payload_len);
-                
-                if (header->mask) {
-                    printf("  Mask key: 0x%02X%02X%02X%02X\n", 
-                        header->mask_key[0], header->mask_key[1], 
-                        header->mask_key[2], header->mask_key[3]);
-                }
-            }
-            
-            const uint8_t* payload = ws_get_payload(parser);
-            size_t payload_len = ws_get_payload_length(parser);
-            
-            if (payload && payload_len > 0) {
-                printf("Payload data:\n");
-                printf("  Length: %zu bytes\n", payload_len);
-                printf("  Hex: ");
-                for (size_t i = 0; i < payload_len && i < 32; i++) {
-                    printf("%02X ", payload[i]);
-                    if ((i + 1) % 16 == 0) printf("\n        ");
-                }
-                if (payload_len > 32) printf("...");
-                printf("\n");
-                
-                printf("  ASCII: ");
-                for (size_t i = 0; i < payload_len && i < 64; i++) {
-                    if (payload[i] >= 32 && payload[i] <= 126) {
-                        printf("%c", payload[i]);
-                    } else {
-                        printf(".");
-                    }
-                }
-                if (payload_len > 64) printf("...");
-                printf("\n");
-            }
-            
-            
-            
-            // 重置解析器状态,准备解析下一个帧
-            ws_parser_reset(parser);
-            
-        } else if (result > 0 && ws_state != WS_STATE_ERROR) {
-            printf("Parser state: %d reset \n", ws_parser_get_state(parser));
-            // 重置解析器状态,准备解析下一个帧
-            ws_parser_reset(parser);
-        } else {
-            printf("Incomplete frame, need more data\n");
-            // printf("Parse error at offset %zu\n", offset);
-            // printf("Parser state: %d\n", ws_parser_get_state(parser));
-        }
-
-        // 移动到下一个帧
-        offset += result;
-        // 添加安全检查
-        if (offset >= test_data_len) {
-            printf("Reached end of data\n");
-            break;
-        }
-    }
-    
-    printf("\n=== Multi-Frame Parsing Complete ===\n");
-    printf("Total frames parsed: %d\n", frame_count);
-    printf("Total bytes processed: %zu\n", offset);
-    printf("Remaining bytes: %zu\n", test_data_len - offset);
-    
-    // 清理
-    ws_parser_destroy(parser);
-}
-
-// 单帧测试函数(保留原有功能)
-void test_single_frame() {
-    printf("\n=== Single WebSocket Frame Test ===\n");
-    
-    // 测试数据:82 48 7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E8 BF 99 E6 A0 B7 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D
-
-    // 测试数据:WebSocket帧
-uint8_t test_data[] = {
-    // WebSocket帧头: 81 7E (FIN=1, Opcode=1, Mask=0, PayloadLen=126)
-    0x81, 0x7E,
-    
-    // 扩展长度: 00 BB (187字节)
-    0x00, 0xBB,
-    
-    // 负载数据开始: 7B 22 73 74 61 74 75 73 22 3A 32 30 30 30 30 30 30 30
-    0x7B, 0x22, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3A, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-    
-    // 继续负载数据: 2C 22 6D 73 67 22 3A 22 73 75 63 63 65 73 73 22
-    0x2C, 0x22, 0x6D, 0x73, 0x67, 0x22, 0x3A, 0x22, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22,
-    
-    // 继续负载数据: 2C 22 74 61 73 6B 5F 69 64 22 3A 22 34 63 64 39 35
-    0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A, 0x22, 0x34, 0x63, 0x64, 0x39, 0x35,
-    
-    // 继续负载数据: 62 62 39 35 63 37 35 39 32 65 38 38 31 31 63 37
-    0x62, 0x62, 0x39, 0x35, 0x63, 0x37, 0x35, 0x39, 0x32, 0x65, 0x38, 0x38, 0x31, 0x31, 0x63, 0x37,
-    
-    // 继续负载数据: 65 37 65 36 64 33 36 65 39 32 35 22 2C 22 65 76
-    0x65, 0x37, 0x65, 0x36, 0x64, 0x33, 0x36, 0x65, 0x39, 0x32, 0x35, 0x22, 0x2C, 0x22, 0x65, 0x76,
-    
-    // 继续负载数据: 65 6E 74 22 3A 22 43 68 61 6E 67 65 64 22 2C 22
-    0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0x43, 0x68, 0x61, 0x6E, 0x67, 0x65, 0x64, 0x22, 0x2C, 0x22,
-    
-    // 继续负载数据: 72 65 73 75 6C 74 22 3A 7B 22 72 65 73 75 6C 74
-    0x72, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x22, 0x3A, 0x7B, 0x22, 0x72, 0x65, 0x73, 0x75, 0x6C, 0x74,
-    
-    // 继续负载数据: 22 3A 22 E4 BD A0 EF BC 8C 22 2C 22 69 73 5F 65
-    0x22, 0x3A, 0x22, 0xE4, 0xBD, 0xA0, 0xEF, 0xBC, 0x8C, 0x22, 0x2C, 0x22, 0x69, 0x73, 0x5F, 0x65,
-    
-    // 继续负载数据: 6E 64 22 3A 66 61 6C 73 65 2C 22 73 65 6E 74 65
-    0x6E, 0x64, 0x22, 0x3A, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x22, 0x2C, 0x22, 0x73, 0x65, 0x6E, 0x74,
-    
-    // 继续负载数据: 6E 63 65 5F 69 64 22 3A 22 22 2C 22 73 74 61 72
-    0x6E, 0x63, 0x65, 0x5F, 0x69, 0x64, 0x22, 0x3A, 0x22, 0x22, 0x2C, 0x22, 0x73, 0x74, 0x61, 0x72,
-    
-    // 继续负载数据: 74 5F 74 69 6D 65 22 3A 30 2C 22 65 6E 64 5F 74
-    0x74, 0x5F, 0x74, 0x69, 0x6D, 0x65, 0x22, 0x3A, 0x30, 0x22, 0x2C, 0x22, 0x65, 0x6E, 0x64, 0x5F, 0x74,
-    
-    // 继续负载数据: 69 6D 65 22 3A 30 7D 7D
-    0x69, 0x6D, 0x65, 0x22, 0x3A, 0x30, 0x7D, 0x7D
-};
-    // uint8_t test_data[] = {
-    //     0x82, 0x48, 0x7B, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x22, 0x6D, 0x69, 0x64, 0x64, 0x6C,
-    //     0x65, 0x22, 0x2C, 0x22, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0xE8, 0xBF,
-    //     0x99, 0xE6, 0xA0, 0xB7, 0x22, 0x2C, 0x22, 0x74, 0x61, 0x73, 0x6B, 0x5F, 0x69, 0x64, 0x22, 0x3A,
-    //     0x22, 0x22, 0x2C, 0x22, 0x72, 0x65, 0x61, 0x73, 0x6F, 0x6E, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F,
-    //     0x6E, 0x74, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x22, 0x22, 0x7D
-    // };
-    
-    size_t test_data_len = sizeof(test_data);
-    
-    printf("Test data length: %zu bytes\n", test_data_len);
-    printf("Test data (hex): ");
-    for (size_t i = 0; i < test_data_len; i++) {
-        printf("%02X ", test_data[i]);
-        if ((i + 1) % 16 == 0) printf("\n                    ");
-    }
-    printf("\n");
-    
-    // 创建解析器
-    ws_parser_t* parser = ws_parser_init();
-    if (!parser) {
-        printf("Failed to create parser\n");
-        return;
-    }
-    
-    // 解析数据
-    int result = ws_parse_stream(parser, test_data, test_data_len);
-    
-    if (result > 0) {
-        printf("\n=== Parse Result ===\n");
-        printf("Parsed bytes: %d\n", result);
-        
-        const ws_header_t* header = ws_get_header(parser);
-        if (header) {
-            printf("Frame header:\n");
-            printf("  FIN: %d\n", header->fin);
-            printf("  RSV: %d%d%d\n", header->rsv1, header->rsv2, header->rsv3);
-            printf("  Opcode: 0x%02X\n", header->opcode);
-            printf("  Mask: %d\n", header->mask);
-            printf("  Payload length: %llu\n", (unsigned long long)header->payload_len);
-            
-            if (header->mask) {
-                printf("  Mask key: 0x%02X%02X%02X%02X\n", 
-                    header->mask_key[0], header->mask_key[1], 
-                    header->mask_key[2], header->mask_key[3]);
-            }
-        }
-        
-        const uint8_t* payload = ws_get_payload(parser);
-        size_t payload_len = ws_get_payload_length(parser);
-        
-        if (payload && payload_len > 0) {
-            printf("\nPayload data:\n");
-            printf("  Length: %zu bytes\n", payload_len);
-            printf("  Hex: ");
-            for (size_t i = 0; i < payload_len && i < 64; i++) {
-                printf("%02X ", payload[i]);
-                if ((i + 1) % 16 == 0) printf("\n        ");
-            }
-            if (payload_len > 64) printf("...");
-            printf("\n");
-            
-            printf("  ASCII: ");
-            for (size_t i = 0; i < payload_len && i < 64; i++) {
-                if (payload[i] >= 32 && payload[i] <= 126) {
-                    printf("%c", payload[i]);
-                } else {
-                    printf(".");
-                }
-            }
-            if (payload_len > 64) printf("...");
-            printf("\n");
-        }
-        
-        printf("\nParser state: %d\n", ws_parser_get_state(parser));
-        
-    } else if (result == 0) {
-        printf("Incomplete frame, need more data\n");
-        printf("Parser state: %d\n", ws_parser_get_state(parser));
-    } else {
-        printf("Parse error\n");
-        printf("Parser state: %d\n", ws_parser_get_state(parser));
-    }
-    
-    // 清理
-    ws_parser_destroy(parser);
-}
-
-int main() {
-    printf("WebSocket Parser Standalone Test\n");
-    printf("================================\n");
-    
-    // 测试单帧解析
-    test_single_frame();
-    
-    // 测试多帧解析
-    test_multiple_frames();
-    
-    printf("\nAll tests completed.\n");
-    return 0;
-}
-
-#endif
\ No newline at end of file
diff --git a/test_ws_parser/websocket_parser_test.cpp b/test_ws_parser/websocket_parser_test.cpp
new file mode 100644 (file)
index 0000000..f1f9160
--- /dev/null
@@ -0,0 +1,166 @@
+#include "websocket_parser_standalone.cpp"
+#include <errno.h>
+#include <string.h>
+
+// 多包拆解测试函数
+
+void decode_data(ws_parser_t* parser,uint8_t* data, size_t len) {
+       
+       
+       printf("Test data length: %zu bytes\n", len);
+       printf("Test data (hex): ");
+       for (size_t i = 0; i < len; i++) {
+               printf("%02X ", data[i]);
+               if ((i + 1) % 16 == 0) printf("\n                    ");
+       }
+       printf("\n");
+
+       size_t offset = 0;
+       int frame_count = 0;
+       
+       while (offset < len) {
+               printf("\n--- Frame %d ---\n", frame_count + 1);
+               printf("Remaining data: %zu bytes\n", len - offset);
+               
+               // 解析当前帧
+               int result = ws_parse_stream(parser, data + offset, len - offset);
+               ws_parse_state_t ws_state = ws_parser_get_state(parser);
+               printf("ws_state: %d,result: %d\n", ws_state,result);
+               if (result > 0 && ws_state == WS_STATE_COMPLETE) {
+                       frame_count++;
+                       printf("Frame %d parsed successfully, consumed %d bytes\n", frame_count, result);
+                       
+                       const ws_header_t* header = ws_get_header(parser);
+                       if (header) {
+                               printf("Frame header:\n");
+                               printf("  FIN: %d\n", header->fin);
+                               printf("  RSV: %d%d%d\n", header->rsv1, header->rsv2, header->rsv3);
+                               printf("  Opcode: 0x%02X\n", header->opcode);
+                               printf("  Mask: %d\n", header->mask);
+                               printf("  Payload length: %llu\n", (unsigned long long)header->payload_len);
+                               
+                               if (header->mask) {
+                                       printf("  Mask key: 0x%02X%02X%02X%02X\n", 
+                                               header->mask_key[0], header->mask_key[1], 
+                                               header->mask_key[2], header->mask_key[3]);
+                               }
+                       }
+                       
+                       const uint8_t* payload = ws_get_payload(parser);
+                       size_t payload_len = ws_get_payload_length(parser);
+                       
+                       if (payload && payload_len > 0) {
+                               printf("Payload data:\n");
+                               printf("  Length: %zu bytes\n", payload_len);
+                               printf("  Hex: ");
+                               for (size_t i = 0; i < payload_len ; i++) {
+                               // for (size_t i = 0; i < payload_len && i < 32; i++) {
+                                       printf("%02X ", payload[i]);
+                                       if ((i + 1) % 16 == 0) printf("\n        ");
+                               }
+                               // if (payload_len > 32) printf("...");
+                               printf("\n");
+                               
+                               printf("  ASCII: ");
+                               // for (size_t i = 0; i < payload_len && i < 64; i++) {
+                               for (size_t i = 0; i < payload_len ; i++) {
+                                       if (payload[i] >= 32 && payload[i] <= 126) {
+                                               printf("%c", payload[i]);
+                                       } else {
+                                               printf(".");
+                                       }
+                               }
+                               // if (payload_len > 64) printf("...");
+                               printf("\n");
+                       }
+                       
+                       
+                       
+                       // 重置解析器状态,准备解析下一个帧
+                       ws_parser_reset(parser);
+                       
+               } else if (result < 0) {
+                       printf("Parse error, resetting parser\n");
+                       ws_parser_reset(parser);
+               } else {
+                       printf("Incomplete frame, need more data\n");
+               }
+
+               // 移动到下一个帧
+               offset += result;
+               // 添加安全检查
+               if (offset >= len) {
+                       printf("Reached end of data\n");
+                       break;
+               }
+       }
+       
+
+       
+       
+       printf("\n=== Multi-Frame Parsing Complete ===\n");
+       printf("Total frames parsed: %d\n", frame_count);
+       printf("Total bytes processed: %zu\n", offset);
+       printf("Remaining bytes: %zu\n", len - offset);
+       
+}
+
+void test_multiple_frames() {
+       printf("\n=== Multiple WebSocket Frames Test ===\n");
+
+       // #include "data1.c"
+       // #include "data2.c"
+       #define data1_filename "/home/snicker/fd230_650/test_ws_parser/data1.bin"
+       #define data2_filename "/home/snicker/fd230_650/test_ws_parser/data2.bin"
+       printf("Opening files...\n");
+       printf("data1 path: %s\n", data1_filename);
+       printf("data2 path: %s\n", data2_filename);
+       FILE *file1 = fopen(data1_filename, "rb");
+       FILE *file2 = fopen(data2_filename, "rb");
+       printf("file1=%p file2=%p\n", (void*)file1, (void*)file2);
+       if (!file1) { printf("fopen data1 failed: %s\n", strerror(errno)); }
+       if (!file2) { printf("fopen data2 failed: %s\n", strerror(errno)); }
+       if (!file1 || !file2) { printf("Failed to open files\n"); return; }
+       fseek(file1, 0, SEEK_END);
+       size_t data1_size = ftell(file1);
+       fseek(file2, 0, SEEK_END);
+       size_t data2_size = ftell(file2);
+       fseek(file1, 0, SEEK_SET);
+       fseek(file2, 0, SEEK_SET);
+       printf("sizes: data1=%zu data2=%zu\n", data1_size, data2_size);
+       uint8_t *data1 = (uint8_t *)malloc(data1_size);
+       uint8_t *data2 = (uint8_t *)malloc(data2_size);
+       printf("malloc: data1=%p data2=%p\n", (void*)data1, (void*)data2);
+       size_t r1 = fread(data1, 1, data1_size, file1);
+       size_t r2 = fread(data2, 1, data2_size, file2);
+       printf("fread: r1=%zu r2=%zu\n", r1, r2);
+       fclose(file1);
+       fclose(file2);
+
+       // 创建解析器
+       printf("Creating parser...\n");
+       ws_parser_t* parser = ws_parser_init();
+       printf("parser=%p\n", (void*)parser);
+       if (!parser) {
+               printf("Failed to create parser\n");
+               return;
+       }
+       
+       // 多包拆解测试
+       printf("\n=== Starting Multi-Frame Parsing ===\n");
+       decode_data(parser,data1,data1_size);
+       // decode_data(parser,data2,data2_size);
+       // 清理
+       ws_parser_destroy(parser);
+}
+
+int main() {
+       printf("WebSocket Parser Standalone Test\n");
+       printf("================================\n");
+       
+       // 测试多帧解析
+       test_multiple_frames();
+       
+       printf("\nAll tests completed.\n");
+       return 0;
+}
\ No newline at end of file
index daf483f..64c080b 100644 (file)
 {
   "summary": {
-    "total_frames": 9,
-    "total_bytes": 503,
-    "valid_frames": 9,
-    "skipped_frames": 494
+    "total_frames": 20,
+    "total_bytes": 977,
+    "valid_frames": 20,
+    "skipped_frames": 957
   },
   "frames": [
     {
       "frame_index": 0,
-      "offset": 0,
+      "offset": 11,
       "header": {
-        "fin": 1,
-        "rsv": 3,
-        "rsv_binary": "011",
-        "opcode": "0x02",
-        "opcode_name": "BINARY",
-        "mask": 1,
-        "payload_length": 75
+        "fin": 0,
+        "rsv": 0,
+        "rsv_binary": "000",
+        "opcode": "0x0A",
+        "opcode_name": "PONG",
+        "mask": 0,
+        "payload_length": 58
       },
-      "frame_size": 81,
-      "payload_hex": "B2 CB 2C 65 94 15 47 92 C0 60 81 84 0E 08 10 50 C0 E5 96 4F FF F9 67 FF CB 2C A9 60 60 A0 81 CA 8F 21 91 91 97 FF FF FF C4 64 65 E4 65 FF E6 46 73 23 23 23 32 32 32 32 1F FF F3 23 76 76 76 76 79 38 D3 8B 28 B3 0F 2D A4 E2 CA",
-      "payload_utf8": ",e\u0015G`\u000e\b\u0010POg,``ʏ!deeFs###2222\u001f#vvvvy8Ӌ(\u000f-",
+      "frame_size": 60,
+      "payload_hex": "FF 41 22 2A 59 46 AF 61 2A 48 AA 02 D2 51 24 64 29 81 A7 21 B6 64 FD 88 4B 8D 77 70 F9 11 CC A4 19 12 43 01 A8 9F 56 C0 2C 0C 64 0B A1 0D CA F6 1E EA 25 D9 4B 8A 04 DE F2 B5",
+      "payload_utf8": "A\"*YFa*H\u0002Q$d)!dKwp\u0011̤\u0019\u0012C\u0001V,\fd\u000b\r\u001e%K\u0004",
       "payload_json": null
     },
     {
       "frame_index": 1,
-      "offset": 95,
+      "offset": 80,
       "header": {
         "fin": 0,
-        "rsv": 3,
-        "rsv_binary": "011",
-        "opcode": "0x08",
-        "opcode_name": "CLOSE",
+        "rsv": 0,
+        "rsv_binary": "000",
+        "opcode": "0x02",
+        "opcode_name": "BINARY",
         "mask": 1,
-        "payload_length": 50
+        "payload_length": 62
       },
-      "frame_size": 56,
-      "payload_hex": "F3 48 C4 DF 18 BB F2 14 F4 28 45 5D 4E 34 E2 CA 3C C0 3A 4C 41 4D 45 33 2E 31 30 30 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA",
-      "payload_utf8": "H\u0018\u0014(E]N4<:LAME3.100",
+      "frame_size": 68,
+      "payload_hex": "BF FF D5 36 7F AD A7 45 2F 1F 3D DE A4 5B 57 A3 77 4A 09 8A EA CF A0 79 D6 BD DF 6E FE A9 B8 D6 AD BF FE 47 FF A3 EF 5D 28 CE 68 A9 C9 C0 B9 A5 17 53 08 3A F0 44 FF F3 48 C4 74 19 42 42",
+      "payload_utf8": "6\7fE/\u001f=ޤ[WwJ\tϠyֽn֭G](h\u0017S\b:DHt\u0019BB",
       "payload_json": null
     },
     {
       "frame_index": 2,
-      "offset": 151,
+      "offset": 194,
       "header": {
         "fin": 1,
-        "rsv": 2,
-        "rsv_binary": "010",
-        "opcode": "0x0A",
-        "opcode_name": "PONG",
-        "mask": 1,
-        "payload_length": 42
+        "rsv": 0,
+        "rsv_binary": "000",
+        "opcode": "0x09",
+        "opcode_name": "PING",
+        "mask": 0,
+        "payload_length": 103
       },
-      "frame_size": 48,
-      "payload_hex": "AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA",
-      "payload_utf8": "",
+      "frame_size": 105,
+      "payload_hex": "91 59 98 6A B7 11 80 85 56 55 61 42 82 E1 AD 38 BB 29 57 5B E9 F3 B7 A3 5A 75 7F 59 7A 00 8B 23 20 E9 50 03 00 63 95 BC 73 95 BA AD 46 1C 10 A8 C7 36 FD 8E B1 64 54 A9 46 54 CA 4E 46 6A BA DA 45 99 2F A7 A5 29 9F 74 06 A3 25 E5 A3 D5 88 CF 2E 7D 4B AF F3 18 C5 52 FF F3 48 C4 92 15 A0 56 44 0C 7E 18 24 95 AF",
+      "payload_utf8": "Yj\u0011VUaB8)W[Zu\7fYz\u0000# P\u0003\u0000csF\u001c\u00106dTFTNFjE/)t\u0006%Ո.}K\u0018RHĒ\u0015VD\f~\u0018$",
       "payload_json": null
     },
     {
       "frame_index": 3,
-      "offset": 199,
+      "offset": 352,
       "header": {
-        "fin": 1,
-        "rsv": 2,
-        "rsv_binary": "010",
-        "opcode": "0x0A",
-        "opcode_name": "PONG",
-        "mask": 1,
-        "payload_length": 42
+        "fin": 0,
+        "rsv": 0,
+        "rsv_binary": "000",
+        "opcode": "0x00",
+        "opcode_name": "CONTINUATION",
+        "mask": 0,
+        "payload_length": 106
       },
-      "frame_size": 48,
-      "payload_hex": "AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA FF F3 48",
-      "payload_utf8": "H",
+      "frame_size": 108,
+      "payload_hex": "96 BE AE EA 82 65 89 30 C1 B8 2B 24 1D 9D 1A 58 F5 68 73 4B 56 71 C4 45 A7 98 54 6E 22 5A 14 05 66 A7 4C 3D 86 96 02 F4 B6 E6 87 14 05 88 B7 2A 45 A4 85 69 DF AD D6 50 7A C5 0E 41 5A 9B D7 B2 A6 38 59 02 CD 40 A9 9B 99 17 FF F3 48 C4 BE 1A DB 6E 24 4A 60 C4 7D 3A A0 AC 19 40 B0 E5 4C 41 4D 45 33 2E 31 30 30 55 55 55",
+      "payload_utf8": "e0+$\u001d\u001aXhsKVqETn\"Z\u0014\u0005fL=\u0002\u0014\u0005*Ei߭Pz\u000eAZײ8Y\u0002@\u0017Hľ\u001an$J`}:\u0019@LAME3.100UUU",
       "payload_json": null
     },
     {
       "frame_index": 4,
-      "offset": 252,
+      "offset": 508,
       "header": {
         "fin": 1,
-        "rsv": 7,
-        "rsv_binary": "111",
-        "opcode": "0x08",
-        "opcode_name": "CLOSE",
+        "rsv": 0,
+        "rsv_binary": "000",
+        "opcode": "0x02",
+        "opcode_name": "BINARY",
         "mask": 0,
-        "payload_length": 52
+        "payload_length": 352
       },
-      "frame_size": 54,
-      "payload_hex": "18 4D CC AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA",
-      "payload_utf8": "\u0018M̪",
+      "frame_size": 356,
+      "payload_hex": "55 55 04 A7 36 8D C9 65 92 BC 48 8A EE 0E 89 4B 59 88 95 3A C5 15 53 CE D2 8A 9E 74 F1 54 73 C5 91 FA B2 28 2A 59 77 E5 8A AD C7 90 CF F6 11 45 F1 29 61 E7 49 16 5B 8E FA 9F 4D 87 4B 79 55 B9 FF F3 48 C4 CF 14 A0 12 31 94 18 44 00 FF FF E4 A5 76 1D 4A 4C 41 4D 45 33 2E 31 30 30 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA FF F3 48 C4 C1 11 28 06 22 5E 00 46 00 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA",
+      "payload_utf8": "UU\u00046eH\u000eKY:\u0015SҊtTső(*Yw劭ǐ\u0011E)aI\u0016[MKyUH\u0014\u00121\u0018D\u0000v\u001dJLAME3.100H\u0011(\u0006\"^\u0000F\u0000",
       "payload_json": null
     },
     {
       "frame_index": 5,
-      "offset": 306,
+      "offset": 864,
       "header": {
         "fin": 1,
-        "rsv": 2,
-        "rsv_binary": "010",
-        "opcode": "0x0A",
-        "opcode_name": "PONG",
-        "mask": 1,
-        "payload_length": 42
+        "rsv": 0,
+        "rsv_binary": "000",
+        "opcode": "0x01",
+        "opcode_name": "TEXT",
+        "mask": 0,
+        "payload_length": 114
       },
-      "frame_size": 48,
-      "payload_hex": "AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA",
-      "payload_utf8": "",
+      "frame_size": 116,
+      "payload_hex": "7B 22 68 65 61 64 65 72 22 3A 7B 22 65 76 65 6E 74 22 3A 22 45 6E 64 53 79 6E 74 68 65 73 69 73 22 2C 22 6D 73 67 22 3A 22 73 75 63 63 65 73 73 22 2C 22 73 74 61 74 75 73 22 3A 32 30 30 30 30 30 30 30 2C 22 74 61 73 6B 5F 69 64 22 3A 22 63 66 38 62 32 65 63 39 61 33 34 39 65 35 30 31 61 36 33 61 36 33 30 32 38 62 61 38 36 38 31 34 74 79 70",
+      "payload_utf8": "{\"header\":{\"event\":\"EndSynthesis\",\"msg\":\"success\",\"status\":20000000,\"task_id\":\"cf8b2ec9a349e501a63a63028ba86814typ",
       "payload_json": null
     },
     {
       "frame_index": 6,
-      "offset": 354,
+      "offset": 1008,
       "header": {
         "fin": 1,
-        "rsv": 2,
-        "rsv_binary": "010",
-        "opcode": "0x0A",
-        "opcode_name": "PONG",
-        "mask": 1,
-        "payload_length": 42
+        "rsv": 0,
+        "rsv_binary": "000",
+        "opcode": "0x00",
+        "opcode_name": "CONTINUATION",
+        "mask": 0,
+        "payload_length": 34
       },
-      "frame_size": 48,
-      "payload_hex": "AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 81 72 7B 22 68 65 61 64 65 72 22 3A 7B 22",
-      "payload_utf8": "r{\"header\":{\"",
+      "frame_size": 36,
+      "payload_hex": "2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A",
+      "payload_utf8": ",\"task_id\":\"\",\"reasoning_content\":",
       "payload_json": null
     },
     {
       "frame_index": 7,
-      "offset": 407,
+      "offset": 1047,
       "header": {
-        "fin": 0,
-        "rsv": 2,
-        "rsv_binary": "010",
+        "fin": 1,
+        "rsv": 0,
+        "rsv_binary": "000",
         "opcode": "0x02",
         "opcode_name": "BINARY",
         "mask": 0,
-        "payload_length": 58
+        "payload_length": 72
       },
-      "frame_size": 60,
-      "payload_hex": "22 45 6E 64 53 79 6E 74 68 65 73 69 73 22 2C 22 6D 73 67 22 3A 22 73 75 63 63 65 73 73 22 2C 22 73 74 61 74 75 73 22 3A 32 30 30 30 30 30 30 30 2C 22 74 61 73 6B 5F 69 64 22",
-      "payload_utf8": "\"EndSynthesis\",\"msg\":\"success\",\"status\":20000000,\"task_id\"",
-      "payload_json": null
+      "frame_size": 74,
+      "payload_hex": "7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E5 9B 9E E5 A4 8D 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D",
+      "payload_utf8": "{\"type\":\"middle\",\"content\":\"回复\",\"task_id\":\"\",\"reasoning_content\":\"\"}",
+      "payload_json": {
+        "type": "middle",
+        "content": "回复",
+        "task_id": "",
+        "reasoning_content": ""
+      }
     },
     {
       "frame_index": 8,
-      "offset": 467,
+      "offset": 1121,
       "header": {
-        "fin": 0,
-        "rsv": 3,
-        "rsv_binary": "011",
-        "opcode": "0x0A",
-        "opcode_name": "PONG",
+        "fin": 1,
+        "rsv": 0,
+        "rsv_binary": "000",
+        "opcode": "0x02",
+        "opcode_name": "BINARY",
         "mask": 0,
-        "payload_length": 34
+        "payload_length": 71
       },
-      "frame_size": 36,
-      "payload_hex": "37 63 30 31 36 37 61 63 63 30 61 37 32 31 38 37 65 33 64 61 31 31 39 61 36 61 35 61 62 62 33 30 22 7D",
-      "payload_utf8": "7c0167acc0a72187e3da119a6a5abb30\"}",
-      "payload_json": null
+      "frame_size": 73,
+      "payload_hex": "7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 EF BC 9A 5C 22 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D",
+      "payload_utf8": "{\"type\":\"middle\",\"content\":\":\\\"\",\"task_id\":\"\",\"reasoning_content\":\"\"}",
+      "payload_json": {
+        "type": "middle",
+        "content": ":\"",
+        "task_id": "",
+        "reasoning_content": ""
+      }
+    },
+    {
+      "frame_index": 9,
+      "offset": 1194,
+      "header": {
+        "fin": 1,
+        "rsv": 0,
+        "rsv_binary": "000",
+        "opcode": "0x02",
+        "opcode_name": "BINARY",
+        "mask": 0,
+        "payload_length": 72
+      },
+      "frame_size": 74,
+      "payload_hex": "7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E5 A5 BD E7 9A 84 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D",
+      "payload_utf8": "{\"type\":\"middle\",\"content\":\"好的\",\"task_id\":\"\",\"reasoning_content\":\"\"}",
+      "payload_json": {
+        "type": "middle",
+        "content": "好的",
+        "task_id": "",
+        "reasoning_content": ""
+      }
+    },
+    {
+      "frame_index": 10,
+      "offset": 1268,
+      "header": {
+        "fin": 1,
+        "rsv": 0,
+        "rsv_binary": "000",
+        "opcode": "0x02",
+        "opcode_name": "BINARY",
+        "mask": 0,
+        "payload_length": 69
+      },
+      "frame_size": 71,
+      "payload_hex": "7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 EF BC 8C 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D",
+      "payload_utf8": "{\"type\":\"middle\",\"content\":\",\",\"task_id\":\"\",\"reasoning_content\":\"\"}",
+      "payload_json": {
+        "type": "middle",
+        "content": ",",
+        "task_id": "",
+        "reasoning_content": ""
+      }
+    },
+    {
+      "frame_index": 11,
+      "offset": 1339,
+      "header": {
+        "fin": 1,
+        "rsv": 0,
+        "rsv_binary": "000",
+        "opcode": "0x02",
+        "opcode_name": "BINARY",
+        "mask": 0,
+        "payload_length": 72
+      },
+      "frame_size": 74,
+      "payload_hex": "7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E5 A6 88 E5 A6 88 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D",
+      "payload_utf8": "{\"type\":\"middle\",\"content\":\"妈妈\",\"task_id\":\"\",\"reasoning_content\":\"\"}",
+      "payload_json": {
+        "type": "middle",
+        "content": "妈妈",
+        "task_id": "",
+        "reasoning_content": ""
+      }
+    },
+    {
+      "frame_index": 12,
+      "offset": 1413,
+      "header": {
+        "fin": 1,
+        "rsv": 0,
+        "rsv_binary": "000",
+        "opcode": "0x02",
+        "opcode_name": "BINARY",
+        "mask": 0,
+        "payload_length": 75
+      },
+      "frame_size": 77,
+      "payload_hex": "7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E3 80 82 5C 22 5C 6E 5C 6E 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D",
+      "payload_utf8": "{\"type\":\"middle\",\"content\":\"。\\\"\\n\\n\",\"task_id\":\"\",\"reasoning_content\":\"\"}",
+      "payload_json": {
+        "type": "middle",
+        "content": "。\"\n\n",
+        "task_id": "",
+        "reasoning_content": ""
+      }
+    },
+    {
+      "frame_index": 13,
+      "offset": 1490,
+      "header": {
+        "fin": 1,
+        "rsv": 0,
+        "rsv_binary": "000",
+        "opcode": "0x02",
+        "opcode_name": "BINARY",
+        "mask": 0,
+        "payload_length": 69
+      },
+      "frame_size": 71,
+      "payload_hex": "7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E5 88 9A 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D",
+      "payload_utf8": "{\"type\":\"middle\",\"content\":\"刚\",\"task_id\":\"\",\"reasoning_content\":\"\"}",
+      "payload_json": {
+        "type": "middle",
+        "content": "刚",
+        "task_id": "",
+        "reasoning_content": ""
+      }
+    },
+    {
+      "frame_index": 14,
+      "offset": 1561,
+      "header": {
+        "fin": 1,
+        "rsv": 0,
+        "rsv_binary": "000",
+        "opcode": "0x02",
+        "opcode_name": "BINARY",
+        "mask": 0,
+        "payload_length": 72
+      },
+      "frame_size": 74,
+      "payload_hex": "7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E6 94 BE E4 B8 8B 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D",
+      "payload_utf8": "{\"type\":\"middle\",\"content\":\"放下\",\"task_id\":\"\",\"reasoning_content\":\"\"}",
+      "payload_json": {
+        "type": "middle",
+        "content": "放下",
+        "task_id": "",
+        "reasoning_content": ""
+      }
+    },
+    {
+      "frame_index": 15,
+      "offset": 1635,
+      "header": {
+        "fin": 1,
+        "rsv": 0,
+        "rsv_binary": "000",
+        "opcode": "0x02",
+        "opcode_name": "BINARY",
+        "mask": 0,
+        "payload_length": 72
+      },
+      "frame_size": 74,
+      "payload_hex": "7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E6 89 8B E6 9C BA 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D",
+      "payload_utf8": "{\"type\":\"middle\",\"content\":\"手机\",\"task_id\":\"\",\"reasoning_content\":\"\"}",
+      "payload_json": {
+        "type": "middle",
+        "content": "手机",
+        "task_id": "",
+        "reasoning_content": ""
+      }
+    },
+    {
+      "frame_index": 16,
+      "offset": 1709,
+      "header": {
+        "fin": 1,
+        "rsv": 0,
+        "rsv_binary": "000",
+        "opcode": "0x02",
+        "opcode_name": "BINARY",
+        "mask": 0,
+        "payload_length": 69
+      },
+      "frame_size": 71,
+      "payload_hex": "7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 EF BC 8C 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D",
+      "payload_utf8": "{\"type\":\"middle\",\"content\":\",\",\"task_id\":\"\",\"reasoning_content\":\"\"}",
+      "payload_json": {
+        "type": "middle",
+        "content": ",",
+        "task_id": "",
+        "reasoning_content": ""
+      }
+    },
+    {
+      "frame_index": 17,
+      "offset": 1780,
+      "header": {
+        "fin": 1,
+        "rsv": 0,
+        "rsv_binary": "000",
+        "opcode": "0x02",
+        "opcode_name": "BINARY",
+        "mask": 0,
+        "payload_length": 69
+      },
+      "frame_size": 71,
+      "payload_hex": "7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E9 97 A8 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D",
+      "payload_utf8": "{\"type\":\"middle\",\"content\":\"门\",\"task_id\":\"\",\"reasoning_content\":\"\"}",
+      "payload_json": {
+        "type": "middle",
+        "content": "门",
+        "task_id": "",
+        "reasoning_content": ""
+      }
+    },
+    {
+      "frame_index": 18,
+      "offset": 1851,
+      "header": {
+        "fin": 1,
+        "rsv": 0,
+        "rsv_binary": "000",
+        "opcode": "0x02",
+        "opcode_name": "BINARY",
+        "mask": 0,
+        "payload_length": 69
+      },
+      "frame_size": 71,
+      "payload_hex": "7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E9 93 83 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D",
+      "payload_utf8": "{\"type\":\"middle\",\"content\":\"铃\",\"task_id\":\"\",\"reasoning_content\":\"\"}",
+      "payload_json": {
+        "type": "middle",
+        "content": "铃",
+        "task_id": "",
+        "reasoning_content": ""
+      }
+    },
+    {
+      "frame_index": 19,
+      "offset": 1922,
+      "header": {
+        "fin": 1,
+        "rsv": 0,
+        "rsv_binary": "000",
+        "opcode": "0x02",
+        "opcode_name": "BINARY",
+        "mask": 0,
+        "payload_length": 72
+      },
+      "frame_size": 74,
+      "payload_hex": "7B 22 74 79 70 65 22 3A 22 6D 69 64 64 6C 65 22 2C 22 63 6F 6E 74 65 6E 74 22 3A 22 E5 93 8D E4 BA 86 22 2C 22 74 61 73 6B 5F 69 64 22 3A 22 22 2C 22 72 65 61 73 6F 6E 69 6E 67 5F 63 6F 6E 74 65 6E 74 22 3A 22 22 7D",
+      "payload_utf8": "{\"type\":\"middle\",\"content\":\"响了\",\"task_id\":\"\",\"reasoning_content\":\"\"}",
+      "payload_json": {
+        "type": "middle",
+        "content": "响了",
+        "task_id": "",
+        "reasoning_content": ""
+      }
     }
   ]
 }
\ No newline at end of file
index f843774..90f5280 100644 (file)
@@ -48,11 +48,11 @@ def analyze_websocket_frames(hex_data):
         payload_len = second_byte & 0x7F
         
         # 验证RSV位 - 只有RSV为0的帧才有效
-        # if rsv != 0:
-        #     print(f"跳过无效帧: 偏移={offset}, RSV={rsv:03b} (非0), 第一个字节=0x{first_byte:02X}")
-        #     offset += 1  # 跳过1字节,继续搜索
-        #     skipped_count += 1
-        #     continue
+        if rsv != 0:
+            print(f"跳过无效帧: 偏移={offset}, RSV={rsv:03b} (非0), 第一个字节=0x{first_byte:02X}")
+            offset += 1  # 跳过1字节,继续搜索
+            skipped_count += 1
+            continue
         
         # 验证操作码是否有效
         valid_opcodes = [0x0, 0x1, 0x2, 0x8, 0x9, 0xA]  # CONTINUATION, TEXT, BINARY, CLOSE, PING, PONG
@@ -124,48 +124,111 @@ def analyze_websocket_frames(hex_data):
     
     print(f"分析完成: 有效帧={len(frames)}, 跳过帧={skipped_count}")
     return frames
+def hex_to_c_array(hex_string, array_name="data", output_file="output.c"):
+    """
+    将十六进制字符串转换为C语言数组并写入文件
+    
+    Args:
+        hex_string (str): 十六进制字符串,可以包含空格或0x前缀
+        array_name (str): C数组的名称
+        output_file (str): 输出文件名
+    """
+    # 清理十六进制字符串,移除空格和0x前缀
+    hex_clean = hex_string.replace(" ", "").replace("0x", "").replace("0X", "")
+    
+    # 验证十六进制字符串
+    try:
+        # 转换为字节数组
+        bytes_data = bytes.fromhex(hex_clean)
+    except ValueError as e:
+        print(f"错误:无效的十六进制字符串 - {e}")
+        return False
+    
+    # 生成C数组内容
+    c_array = f"// 自动生成的C数组\n"
+    c_array += f"// 数组大小: {len(bytes_data)} 字节\n\n"
+    c_array += f"unsigned char {array_name}[] = {{\n"
+    
+    # 每行16个字节,格式化输出
+    for i in range(0, len(bytes_data), 16):
+        line_bytes = bytes_data[i:i+16]
+        hex_values = [f"0x{b:02X}" for b in line_bytes]
+        c_array += f"    {', '.join(hex_values)}"
+        
+        # 如果不是最后一行,添加逗号
+        if i + 16 < len(bytes_data):
+            c_array += ","
+        c_array += "\n"
+    
+    c_array += "};\n\n"
+    c_array += f"unsigned int {array_name}_size = {len(bytes_data)};\n"
+    
+    # 写入文件
+    try:
+        with open(output_file, 'w', encoding='utf-8') as f:
+            f.write(c_array)
+        print(f"成功生成C数组文件: {output_file}")
+        print(f"数组名称: {array_name}")
+        print(f"数组大小: {len(bytes_data)} 字节")
+        return True
+    except Exception as e:
+        print(f"写入文件时出错: {e}")
+        return False
+def hex_to_bin(hex_string, output_file="output.bin"):
+    """
+    将十六进制字符串转换为 bin 数据,并写入文件
+    
+    Args:
+        hex_string (str): 十六进制字符串,可以包含空格或0x前缀        
+        output_file (str): 输出文件名
+    """
+    # 清理十六进制字符串,移除空格和0x前缀
+    hex_clean = hex_string.replace(" ", "").replace("0x", "").replace("0X", "")
+    
+    # 验证十六进制字符串
+    try:
+        # 转换为字节数组
+        bytes_data = bytes.fromhex(hex_clean)
+    except ValueError as e:
+        print(f"错误:无效的十六进制字符串 - {e}")
+        return False
+    
+    # 写入文件
+    try:
+        with open(output_file, 'wb') as f:
+            f.write(bytes_data)
+        print(f"成功生成 bin 文件: {output_file}")
+        return True
+    except Exception as e:
+        print(f"写入文件时出错: {e}")
+        return False
 
 def main():
     # 原始十六进制数据
-    hex_data = """B2 CB 25 96 59 64 B2 CB 2C 65 94 15 47 92 C0 60 
-                    81 84 0E 08 10 50 C0 E5 96 4F FF F9 67 FF CB 2C 
-                    A9 60 60 A0 81 CA 8F 21 91 91 97 FF FF FF C4 64 
-                    65 E4 65 FF E6 46 73 23 23 23 32 32 32 32 1F FF 
-                    F3 23 76 76 76 76 79 38 D3 8B 28 B3 0F 2D A4 E2 
-                    CA 2C C3 DD A6 9D 9C C3 DD 9D 9D 9D 9C D3 8D 38 
-                    B2 8B 28 B3 FF F3 48 C4 DF 18 BB F2 14 F4 28 45 
-                    5D 4E 34 E2 CA 3C C0 3A 4C 41 4D 45 33 2E 31 30 
-                    30 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
-                    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
-                    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
-                    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
-                    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
-                    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
-                    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
-                    AA AA AA AA FF F3 48 C4 EF 1C A4 14 F8 34 18 4D 
-                    CC AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
-                    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
-                    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
-                    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
-                    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
-                    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
-                    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
-                    AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA 
-                    AA AA AA AA 81 72 7B 22 68 65 61 64 65 72 22 3A 
-                    7B 22 65 76 65 6E 74 22 3A 22 45 6E 64 53 79 6E 
-                    74 68 65 73 69 73 22 2C 22 6D 73 67 22 3A 22 73 
-                    75 63 63 65 73 73 22 2C 22 73 74 61 74 75 73 22 
-                    3A 32 30 30 30 30 30 30 30 2C 22 74 61 73 6B 5F 
-                    69 64 22 3A 22 37 63 30 31 36 37 61 63 63 30 61 
-                    37 32 31 38 37 65 33 64 61 31 31 39 61 36 61 35 
-                    61 62 62 33 30 22 7D"""
-    
+    hex_data = ""
+    hex_data2 = ""
+    with open('data1.hex', 'r', encoding='utf-8') as f:
+        hex = f.read()       # bytes
+        hex_data = hex.replace(" ", "").replace("0x", "").replace("0X", "").replace("\n", "").replace("\r", "")
+        # print(hex_data)  # 若需要转为 str       
+
+    with open('data2.hex', 'r', encoding='utf-8') as f:
+        hex2 = f.read()         # bytes
+        hex_data2 = hex2.replace(" ", "").replace("0x", "").replace("0X", "").replace("\n", "").replace("\r", "")
+        # print(hex_data2)
+    hex_to_c_array(hex_data,"data1","data1.c")
+    hex_to_c_array(hex_data2,"data2","data2.c")
+    hex_to_bin(hex_data,"data1.bin")
+    hex_to_bin(hex_data2,"data2.bin")
     # 转换为字节
     data = hex_to_bytes(hex_data)
-    
+    data2 = hex_to_bytes(hex_data2)
+    print("data size:{}".format(len(data)))
+    print("data2 size:{}".format(len(data2)))
+    datasum = data + data2
+    print("datasum size:{}".format(len(datasum)))
     # 分析帧
-    frames = analyze_websocket_frames(data)
-    
+    frames = analyze_websocket_frames(datasum)
     # 生成输出
     output = {
         "summary": {
@@ -181,11 +244,10 @@ def main():
     with open("websocket_simple_analysis.json", "w", encoding="utf-8") as f:
         json.dump(output, f, ensure_ascii=False, indent=2)
         
-    print(f"分析完成,共发现 {len(frames)} 个有效WebSocket帧")
-    print("结果已保存到 websocket_simple_analysis.json")
+    
     
     # 打印前几个帧的摘要
-    for i, frame in enumerate(frames[:5]):
+    for i, frame in enumerate(frames):
         print(f"\n帧 {i+1}:")
         print(f"  偏移: {frame['offset']}")
         print(f"  大小: {frame['frame_size']} 字节")
@@ -196,5 +258,8 @@ def main():
         if frame['payload_json']:
             print(f"  JSON内容: {frame['payload_json']}")
 
+    print("============================================")
+    print(f"分析完成,共发现 {len(frames)} 个有效WebSocket帧")
+    print("结果已保存到 websocket_simple_analysis.json")
 if __name__ == "__main__":
     main()
\ No newline at end of file
diff --git a/test_ws_parser/websocket_test b/test_ws_parser/websocket_test
new file mode 100644 (file)
index 0000000..2ddbef6
Binary files /dev/null and b/test_ws_parser/websocket_test differ