string array to c array file

string array to c array file,第1张

string array to c array file 笔记

运维同事在现场, 和设备通讯, 得到一个大回包, 有1000多个字节的字符串.
程序里面模拟分析时, 需要将同事给的回包字符串转为C数组, 这样才好模拟.
开始试了一下手工对这个回包进行分行, 搞不动啊.
看了一下以前的笔记,写过"string array to c array", 不过那个试验和socket *** 作混在一起了.
重新写了一个demo, 转出来的效果还不错.

转过之后的效果

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;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5611482.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存