运维同事在现场, 和设备通讯, 得到一个大回包, 有1000多个字节的字符串.
程序里面模拟分析时, 需要将同事给的回包字符串转为C数组, 这样才好模拟.
开始试了一下手工对这个回包进行分行, 搞不动啊.
看了一下以前的笔记,写过"string array to c array", 不过那个试验和socket *** 作混在一起了.
重新写了一个demo, 转出来的效果还不错.
vs2017 vc++ console
140行代码
// @file string_ary_to_c_ary.cpp // @brief 将设备16进制回包串转为C数组 #include#include #include unsigned char string_byte_to_hex_byte(char cH, char cL); unsigned char string_char_to_hex_bit4(char c); int main() { // 设备回包 const char pc_dev_recv[] = "01 69 32 30 31 30 30 36 35 32 35 34 35 34 35 37 30 30 31 31 30 30 30 30 30 37 34 35 31 32 46 37 30 44 34 35 31 32 46 37 30 44 34 36 44 41 46 46 34 44 34 31 38 34 45 31 43 33 30 30 30 30 30 30 30 30 34 32 36 34 33 39 35 38 34 33 30 33 30 34 36 35 30 32 31 30 30 30 30 30 37 34 35 42 44 44 35 31 32 34 35 42 44 44 35 31 32 34 36 42 44 45 38 45 42 34 32 30 30 46 45 36 33 33 44 44 30 44 34 44 44 34 32 36 33 44 44 32 46 34 33 30 33 30 34 36 35 30 33 31 30 30 30 30 30 37 34 35 31 33 46 32 43 31 34 35 31 33 46 32 43 31 34 36 44 41 44 46 44 36 34 31 38 35 37 45 32 46 30 30 30 30 30 30 30 30 34 32 36 34 39 35 38 31 34 33 30 33 30 34 36 35 30 34 31 30 30 30 30 30 37 34 35 46 44 41 34 38 45 34 35 46 44 41 34 38 45 34 36 41 44 46 35 30 42 34 32 31 46 30 30 30 30 30 30 30 30 30 30 30 30 34 32 36 33 36 45 39 38 34 33 30 33 30 34 36 35 30 35 31 30 30 30 30 30 37 34 35 30 41 34 45 38 42 34 35 30 41 34 45 38 42 34 36 44 43 31 34 35 44 34 31 37 45 45 35 43 43 30 30 30 30 30 30 30 30 34 32 36 35 42 43 36 42 34 33 30 33 30 34 36 35 30 36 31 30 30 30 30 30 37 34 36 41 33 43 33 30 46 34 36 41 33 43 33 30 46 34 36 31 33 33 36 33 46 34 32 41 38 39 36 39 33 30 30 30 30 30 30 30 30 34 32 36 35 34 44 44 33 34 33 30 33 30 34 36 35 26 26 41 39 35 41 03"; // 转为C数组 int len = strlen(pc_dev_recv); char buf[4096] = { '' }; int i = 0; int i_len_space = 0; // 空格数量 const char* p_cur = pc_dev_recv; for (i = 0; i < len; i++) { if (' ' == *p_cur) { i_len_space++; } p_cur++; } do { // 计算C数组的size int i_c_ary_size = len - i_len_space; if ((i_c_ary_size % 2) != 0) { break; // 每个16进制字节的字符串表示, 必须是2个字节 e.g. "01" } i_c_ary_size /= 2; unsigned char* puc_ary = new unsigned char[i_c_ary_size]; int i_idx_puc_ary = 0; p_cur = pc_dev_recv; for (i = 0; i < len;) { if (' ' == *p_cur) { p_cur++; i++; continue; } puc_ary[i_idx_puc_ary++] = string_byte_to_hex_byte(*(p_cur + 0), *(p_cur + 1)); p_cur += 2; i += 2; } // 将数组打印到文件 FILE* file = fopen("stirng_to_ary.txt", "wb+"); int i_cnt_col = 0; if (NULL != file) { sprintf(buf, "unsigned char uc_ary[%d] = {rn", i_c_ary_size); fwrite(buf, sizeof(char), strlen(buf), file); for (i = 0; i < i_c_ary_size; i++) { i_cnt_col++; if (i_cnt_col == 1) { sprintf(buf, "t"); fwrite(buf, sizeof(char), strlen(buf), file); } sprintf(buf, "0x%2.2X", puc_ary[i]); fwrite(buf, sizeof(char), strlen(buf), file); if (i != (i_c_ary_size - 1)) { sprintf(buf, ", "); fwrite(buf, sizeof(char), strlen(buf), file); } if ((i_cnt_col % 16) == 0) { i_cnt_col = 0; sprintf(buf, "rn"); fwrite(buf, sizeof(char), strlen(buf), file); } } sprintf(buf, "rn};rn"); fwrite(buf, sizeof(char), strlen(buf), file); fclose(file); file = NULL; } } while (0); return EXIT_SUCCESS; } unsigned char string_byte_to_hex_byte(char cH, char cL) { unsigned char c_rc = 0; c_rc = (string_char_to_hex_bit4(cH) << 4) & 0xf0; c_rc |= string_char_to_hex_bit4(cL); return c_rc; } unsigned char string_char_to_hex_bit4(char c) { unsigned char c_rc = 0x00; do { if (((c >= '0') && (c <= '9')) || ((c >= 'a') && (c <= 'f')) || ((c >= 'A') && (c <= 'F'))) { // input ok if ((c >= '0') && (c <= '9')) { c -= '0'; } else if ((c >= 'a') && (c <= 'f')) { c -= 'a'; } else { c -= 'A'; } c_rc = c; } } while (0); return c_rc; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)