将文本按指定数量字符分割

最近搞了电网的I1协议,其中涉及图片数据,包比较大,分了20包,每包5K大小,远程写的解析代码,没有连接真实设备测试,所以要了一些报文,奈何报文全是16进制字符紧挨在一起,没有合适的分割工具,只好自己写个了。

工具功能

将文本按指定数量字符分割

将16进制文本数据分割后写入数据流保存为文件

将以下代码保存为split.c

/** Includes -----------------------------------------------------------------*/
#include <stdint.h> /**< need definition of uint8_t */
#include <stddef.h> /**< need definition of NULL    */
#include <stdbool.h>/**< need definition of BOOL    */
#include <stdio.h>  /**< if need printf             */
#include <stdlib.h>
#include <string.h>
#include <errno.h>
/** Private includes ---------------------------------------------------------*/
#include <fcntl.h>
#include <unistd.h>
#include <ctype.h>
/** Private defines ----------------------------------------------------------*/
#ifndef OUT_FILE_NAME
	#define OUT_FILE_NAME "default.file"
#endif
/** Exported typedefines -----------------------------------------------------*/

/*文件打开权限*/
typedef enum
{
    
    
	READ_ONLY = 0,
	READ_WRITE_ONLY,
	WRITE_CREAT_CLEAR,
	READ_WRITE_CREAT_CLEAR,
	WRITE_APPEND_CREAT,
	READ_WRITE_APPEND_CREAT,
}FILE_OPEN_MODE;

/*文件分割方式*/
typedef enum
{
    
    
	SPACE_SPLIT = 0,
	COMMA_SPLIT,
}FILE_SPLIT_MODE;

/** Exported constants -------------------------------------------------------*/

/** Exported macros-----------------------------------------------------------*/
#define PRINT_ERRMSG(STR) fprintf(stderr,"line:%d,msg:%s,eMsg:%s\n", __LINE__, STR, strerror(errno))
/** Exported variables -------------------------------------------------------*/
/** Exported functions prototypes --------------------------------------------*/
/*返回指定文件是否存在*/
int file_is_exist(const char *fimename);

/*打开指定文件返回文件描述符*/
FILE *file_open(const char *filename ,FILE_OPEN_MODE mode);

/*读取指定打开的文件,返回总行数*/
int file_get_line_cnt(const char *filename);

/*读取指定打开的文件指定行的内容到缓冲区*/
size_t file_read(const char *filename ,char *destbuf ,size_t size ,int linenum);

/*替换字符*/
size_t file_replace_ch(char *sourcebuf ,char sourcech,char destch);

/*清除字符串空格*/
char *strtriml(char *pstr);
char *strtrimr(char *pstr);
char *strtrim(char *pstr);

/*清除文本中空格,忽略注释标识行*/
bool file_strip_comments(char *string, char comment);
/**
  ******************************************************************
  * @brief   判断文件是否存在
  * @param   [in]fimename 文件名
  * @retval  返回0文件存在
  * @author  aron566
  * @version V1.0
  * @date    2020-08-28
  ******************************************************************
  */
int file_is_exist(const char *fimename)
{
    
    
	return access(fimename ,F_OK | W_OK | R_OK);
}

/**
  ******************************************************************
  * @brief   打开指定文件返回文件描述符,追加模式下fseek(fp, 0, SEEK_SET)无效
  * @param   [in]fimename 文件名
  * @param   [in]mode 打开文件的模式选择
  * @retval  返回0文件存在
  * @author  aron566
  * @version V1.0
  * @date    2020-08-28
  ******************************************************************
  */
FILE *file_open(const char *filename ,FILE_OPEN_MODE mode)
{
    
    
	FILE *fp = NULL;
	switch(mode)
	{
    
    
	case READ_ONLY:
		fp = fopen(filename ,"r");
		break;
	case READ_WRITE_ONLY:
		fp = fopen(filename ,"r+");
		break;
	case WRITE_CREAT_CLEAR:
		fp = fopen(filename ,"w");
		break;
	case READ_WRITE_CREAT_CLEAR:
		fp = fopen(filename ,"w+");
		break;
	case WRITE_APPEND_CREAT:
		fp = fopen(filename ,"a");
		break;
	case READ_WRITE_APPEND_CREAT:
		fp = fopen(filename ,"a+");/**< 首次读取时,从文件头部开始读*/
		break;
	}
	return fp;
}

/**
  ******************************************************************
  * @brief   打开读取指定打开的文件,返回总行数
  * @param   [in]fp 文件指针
  * @param   [in]filename 文件名称
  * @retval  返回-1读取失败
  * @author  aron566
  * @version V1.0
  * @date    2020-08-28
  ******************************************************************
  */
int file_get_line_cnt(const char *filename)
{
    
    
	int cnt = 0;
	char buf[256];
	FILE *fp = file_open(filename ,READ_ONLY);
	if(fp == NULL)
	{
    
    
		PRINT_ERRMSG("fopen");
		printf("read file name :%s error.\n" ,filename);
		return -1;
	}

	char *ret = NULL;
	/*读取文件流中的内容*/
	while((fgets(buf ,256 ,fp)) != NULL)
	{
    
    
		ret = strchr(buf ,'\n');
		if(ret != NULL)
		{
    
    
			cnt++;
		}
	}

	/*关闭文件*/
	fclose(fp);
	return cnt;
}

/**
  ******************************************************************
  * @brief   读取指定打开的文件指定行的内容到缓冲区
  * @param   [in]filename 文件名称
  * @param   [in]读取到的数据存储区
  * @param   [in]限制长度
  * @param 	 [in]需读取的行
  * @retval  执行结果,读取到字节数
  * @author  aron566
  * @version V1.0
  * @date    2020-08-28
  ******************************************************************
  */
size_t file_read(const char *filename ,char *destbuf ,size_t size ,int linenum)
{
    
    
	int cnt = 0;
	char buf[1024];

	/*初始化缓冲区*/
	if(strlen(destbuf) > 0)
	{
    
    
		destbuf[0] = '\0';
	}

	/*打开文件流*/
	FILE *fp = file_open(filename ,READ_ONLY);
	if(fp == NULL)
	{
    
    
		PRINT_ERRMSG("fopen");
		return -1;
	}

	/*读取文件流中的内容*/
	char *ret = NULL;
	size_t len = 0;
	while((fgets(buf ,1024 ,fp)) != NULL)
	{
    
    
		ret = strchr(buf ,'\n');
		if(ret != NULL)
		{
    
    
			cnt++;
			if(cnt == linenum)
			{
    
    
				if(len == 0)
				{
    
    
					strncpy(destbuf ,buf ,1024);
					if(size > 1024)
					{
    
    
						destbuf[1024] = '\0';
					}
					else
					{
    
    
						destbuf[1023] = '\0';
					}
				}
				else
				{
    
    
					/*追加字符串*/
					len += strlen(buf);
					if(len > size)
					{
    
    
						break;
					}
					else
					{
    
    
						strcat(destbuf ,buf);
					}
				}
				fclose(fp);
				return strlen(destbuf);
			}//cnt == linenum
		}
		else
		{
    
    
			/*判断是否超出缓冲区大小*/
			if(cnt == linenum-1)
			{
    
    
				/*目标缓冲区过小直接退出*/
				if(size <= 1024)
				{
    
    
					break;
				}
				len = strlen(destbuf);
				if(len == 0)
				{
    
    
					strncpy(destbuf ,buf ,1024);
					destbuf[1024] = '\0';
				}
				else
				{
    
    
					/*追加字符串*/
					len += strlen(buf);
					if(len > size)
					{
    
    
						break;
					}
					else
					{
    
    
						strcat(destbuf ,buf);
					}
				}
			}
		}
	}
	fclose(fp);
	return strlen(destbuf);
}

/**
  ******************************************************************
  * @brief   写入指定的内容到文件
  * @param   [in]filename 文件名称
  * @param   [in]buffer数据存储区
  * @param   [in]size写入的元素占总字节数
  * @param 	 [in]count写入元素数目
  * @param 	 [in]mode文件写入模式
  * @retval  执行结果,写入元素的总数
  * @author  aron566
  * @version V1.0
  * @date    2020-10-09
  ******************************************************************
  */
size_t file_write(const char *filename ,const void* buffer ,size_t size ,size_t count ,FILE_OPEN_MODE mode)
{
    
    
	/*打开文件流*/
	FILE *fp = file_open(filename ,mode);
	if(fp == NULL)
	{
    
    
		return 0;
	}
	size_t cnt = fwrite(buffer ,size ,count ,fp);
	/*同步到文件中*/
	fflush(fp);
	fclose(fp);
	return cnt;
}

/**
  ******************************************************************
  * @brief   替换目标字符串中字符
  * @param   [in]目标字符串
  * @param   [in]源字符
  * @param   [in]目标字符
  * @retval  执行结果,当前字符长度
  * @author  aron566
  * @version V1.0
  * @date    2020-08-28
  ******************************************************************
  */
size_t file_replace_ch(char *sourcebuf ,char sourcech,char destch)
{
    
    
    int i;
    i = strlen(sourcebuf) - 1;
    while (sourcebuf[i] == sourcech && (i >= 0))
    	sourcebuf[i--] = destch;
    return strlen(sourcebuf);
}

/**
  ******************************************************************
  * @brief   去除字符串右端空格
  * @param   [in]字符串指针
  * @retval  修剪后的字符串地址
  * @author  aron566
  * @version V1.0
  * @date    2020-08-28
  ******************************************************************
  */
char *strtrimr(char *pstr)
{
    
    
    int i;
    i = strlen(pstr) - 1;
    while (isspace(pstr[i]) && (i >= 0))
        pstr[i--] = '\0';
    return pstr;
}

/**
  ******************************************************************
  * @brief   去除字符串左端空格
  * @param   [in]字符串指针
  * @retval  修剪后的字符串地址
  * @author  aron566
  * @version V1.0
  * @date    2020-08-28
  ******************************************************************
  */
char *strtriml(char *pstr)
{
    
    
    int i = 0,j;
    j = strlen(pstr) - 1;
    while (isspace(pstr[i]) && (i <= j))
        i++;
    if (0<i)
        strcpy(pstr, &pstr[i]);
    return pstr;
}

/**
  ******************************************************************
  * @brief   去除字符串两端空格
  * @param   [in]字符串指针
  * @retval  修剪后的字符串地址
  * @author  aron566
  * @version V1.0
  * @date    2020-08-28
  ******************************************************************
  */
char *strtrim(char *pstr)
{
    
    
    char *p;
    p = strtrimr(pstr);
    return strtriml(p);
}

/**
  ******************************************************************
  * @brief   去掉字符串内所有空白,且忽略注释部分,最终得到没有空白的字符串
  * @param   [in]string:字符串
  * @param   [in]comment:注释标识
  * @retval  true表示数据可用
  * @author  aron566
  * @version V1.0
  * @date    2020-08-31
  ******************************************************************
  */
bool file_strip_comments(char *string, char comment)
{
    
    
  if (NULL == string || '\n' == *string || '\r' == *string) {
    
    
    return false; /* 第一个字符为回车或换行,表示空行 */
  }

  char *p, *q;
  /* 下面去掉字符串中所有空白字符 */
  for (p = q = string; *p != '\0' && *p != comment; p++) {
    
    
	  /* 不是空白字符则重写字符串 */
    if (0 == isspace(*p)) {
    
    
      *q++ = *p;
    }
  }
  *q = '\0';

  return 0 != strlen(string); /* 字符串长度不为0,表示数据可用 */
}

/**
 * @brief 16进制字符转为数值
 * 
 * @param ch 16进制字符
 * @return uint8_t 数值
 */
uint8_t hex_char_to_value(uint8_t ch)
{
    
    
	uint8_t result = 0;
	/*获取16进制的高字节位数据*/
	if (ch >= '0' && ch <= '9')
	{
    
    
		result = ch - '0';
	}
	else if (ch >= 'a' && ch <= 'z')
	{
    
    
		result = ch - 'a' + 10;
	}
	else if (ch >= 'A' && ch <= 'Z')
	{
    
    
		result = ch - 'A' + 10;
	}
	else
	{
    
    
		result = 0;
	}
	return result;
}

/**
 * @brief 将大写字母转换成小写字母
 * 
 * @param ch 大写字母
 * @return uint8_t 小写字母
 */
uint8_t ch_tolower(uint8_t ch)
{
    
    
    if(ch >= 'A' && ch <= 'Z')
    {
    
    
        return ch + 'a' - 'A';
    }
    else
    {
    
    
        return ch;
    }
}

/**
 * @brief 16进制的字符串转换成整数
 * 
 * @param s 16进制字符串
 * @return int 数值
 */
int hextoi(char s[])
{
    
    
    int i = 0;
    int ret = 0;
    if(s[0] == '0' && (s[1]=='x' || s[1]=='X'))
    {
    
      
        i = 2;
    }
    else
    {
    
    
        i = 0;
    }
    for(;(s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'z') || (s[i] >='A' && s[i] <= 'Z');++i)
    {
    
    
        if(ch_tolower(s[i]) > '9')
        {
    
    
            ret = 16 * ret + (10 + ch_tolower(s[i]) - 'a');
        }
        else
        {
    
    
            ret = 16 * ret + (ch_tolower(s[i]) - '0');
        }
    }
    return ret;
}

/**
 * @brief main入口
 * 
 * @param argc 参数个数
 * @return argv[] 参数
 */
int main(int argc ,char *argv[])
{
    
    
	if(argc < 4)
	{
    
    
		printf("Usage:%s filename strlen split_num\n" ,argv[0]);
		return -1;
	}
	int buf_len = atoi(argv[2]);
	char *strbuf = (char*)malloc(sizeof(char)*buf_len);
	if(strbuf == NULL)
	{
    
    
		printf("malloc error!\n");
		return -1;
	}
	memset(strbuf ,0 ,buf_len);

	/*打开文件*/
	FILE *fp = file_open(argv[1] ,READ_ONLY);
	if(fp == NULL)
	{
    
    
		printf("can't open file.\n");
		return -1;
	}

	/*读取文件内容*/
	char txt[64] = {
    
    0};
	while((fgets(txt ,64 ,fp)) != NULL)
   {
    
    
	    /* 去掉字符串所有空白,注释也忽略 */
	    if (file_strip_comments(txt ,' '))
	    {
    
    
	      strcat(strbuf ,txt);
	    }
   }
	
	int split_num = atoi(argv[3]);
	uint8_t temp = 0;
	for(int i = 0;i < buf_len;)
	{
    
    
#if defined (ENABLE_PRINT_CH)
		if(i < split_num)
		{
    
    
			printf("%c%c" ,strbuf[i] ,strbuf[i+1]);
		}
		else
		{
    
    
			printf(" ""%c%c" ,strbuf[i] ,strbuf[i+1]);
		}
#endif
#if defined (ENABLE_OUT_FILE)
		temp = hex_char_to_value(strbuf[i]);
		temp <<= 4;
		temp |= hex_char_to_value(strbuf[i+1]);
		file_write(OUT_FILE_NAME ,&temp ,1 ,1 ,WRITE_APPEND_CREAT);
#endif
		i += split_num;
	}
	
	return 0;
}

使用方法

#编译打印输出功能
gcc split.c -DENABLE_PRINT_CH -o test
#编译成输出文件功能
gcc split.c -DENABLE_OUT_FILE -DOUT_FILE_NAME=\"A.png\" -o test

创建一个文本a.txt填入内容

a55ae513563030303030313230323031343139303405cd8401ff13000b00000000003dda000081114a7d029f6222af9128b340983d36b34a24cac4bd2a0b196a6338d19c288956cf0d090bf6533d20a4f95139c03992e83790219c45bea5ba0058790108b3ed380433b1399a22c9d3f7d2d00e9e00a12aebe12042421ea84481b26817db938633a33c410a4143fa7d1e99100e1e8a70d2a5038528053493d510ba4d2fd1281c4ef161413d5d2501606f60a52d21c03f433d00fd16b20bd3e8fc201d2545a21949b1602717d38634068ff674804da70e657a06b04d2756cc01cc16953ec059984f69d03468399d01a3191282e8d14d500ba3f1282c4e61764ce40e84cc2c0116c3d15168680c6116cc689a110dfc2f0e8129845d403bd3467863f40e69287417fd144034422e8105201d244fc5f281e94b9c920a7a756f8990165da6979c0339885d801a2806788bdc6504526618e17ec10520245c6900c5d103c15174808b4ea7abc0a922d84a98c6c16a676b369d059524caf0941081d02acf499c6d3d0589fa53d06995a811769bcaf387d8438917d4c82c9921b2cc8210017896a2e005fd4bb50424cad33b03c416fc822f0f48287b7a267802ed2af3d1121dcacd9aa044b05c022e31e9346c31a9364a96ad88daeb09a4d80ba88b0d88994f17d405f0e84d806a93280b700700e643f4d505fa4cf8b09e0a7d27f1738c613d05d44ba85a02d4d45bc4c885f8328bc03b845f32772b43ece174206304c7826340d6b1845ace81758136b54089fabe822de1e7108296e7687a82f0213404c10f71a5901286804319daf531980d567d5405f117080ba4cc5f139901af6e100543c5ce6cc0a9a4f579d2dc88245a77aa89e2c225fa41758fc4b8c028baca6972950593a9a29f6a2e0b7294a0a90cecfa021e1b00ba2e61b00f85d245209d589c5a082d4c6622afa42d2d0152fc1410ee57280ba25e218c81fec5fbc2598031d5897e96e73a0329ea8069339aa49e82787bc3c1517594ba5c24fb40f43f1146ba7129d05c6516c2d411719fa4505b86739a5b800b8c1562550a10e022f52ae2c10e19380b115167d81e0b1380b705c22e013dda2fa7a08bd3d2e843459988bff607aba4c7d9416a1165c0a9742c4a0161499a14a52148515305002c282e369c5f3592d0487a74a06bc4b72a5c081f28be0ab49a4ab71e209f85d85ce72a1f6545e0070b4a05dadd26367017f326b09a0173224318a7d7a02dd080019c403c4fe2e008a9420157984bb280529fa42ad85c32a14b929e900e9c4505ba4c117809bd8bf69dc805387807d95644fa00a2d9bc02502001f493f4414b345d80644154c10e016148a05f82fca2dc209c339a134053fe88289c5a4bd26c44fd5f49a4e0286d055542ec0a689b26843990ea02d422822f3111a04a521055e61152a068d10f540fb3d00bb32802db84fe1f8a21dea59959a202745f13d05c64bb4972505b345d22c045ee088055a7a80b4a99503ef075140d22dc44e82a75669202d348b40bb34202d2443f416af89d3c14d1e07806b26fd404d5d1fc45a05c7c14ba3809421a05ef152fc250586b21fc039a318a6d01758c94fa20255385d8161fd3d4b320a54de415559ab74140a700a5d953b9e88ba09bd9980216654045e928b10e2c3808b761c0328a77a26a2d09b042ae49a02d2632630700c94eac980657086340d65252808ba3d2822929cc8a615347404160169939828229a49a10c90b54122e8f09b04ee57f4e1c0222dd1f6070b53f5aa097097190d80001b8b83801348b4b7206325da632601a8054697f52ada806f253ec9f001a2900b82c101ab84a98cc5c640ab6e50ed03a26d60299ced2c2ec55ef53390bb046b133d6566445e2484fb33802989e9ca01ac09d500ce4fa405f0894a0673550516e0bf485d01f79caa774a2267a74ce0f01ae33e957ec05cb3eaa2ae93393f85b804fd59f4977b51008705087501a4ea2d033a2eca80a78802dd22a019fb2dd05ce151644a5c9905c19ca5984be8550f405e93054bf20b318c5225ba2fd20454bbd1d517cfb4c14a0b7425300b9d22e6f7298c50385f83c000abbf3d0417288aba8200bd3094011a9c39ac2a2717f12eca0bf897e4b4f002c45054f4b92e7a0bba9e820bf44d22e32a2732a9765c82a68a6f391054a82adf92fc0502f565f10d808a503a14c804d80117894bb05ef4fc4ab9de2a0652d339d15453f894b71b05b0b59017ff47dafe24d817356d4e99bf821f41e801e9729720b4a9e2d05b532100c616ee25994bb05356153f40be459a21404a00aa94e817fa1c4a0b77a3a9f4bc00ce7e12ecde41688b7415749c37f45d8b4bb090fb0a4df02ecbf4213d45b40307385fa01689d2e85a534140b0bf45d806cfd2a50aa64fb2d0a7d8633a86c427b09787334a0438972bf607a53d4a0bf65fa2a02df83da59e28a5f53a5d1c046bacad0589ed29761a52cc2173911697452fa091aacdab9c0193ce21805fa0fe82949b45a214a54054abfa9fc05a77d0157290e17205f0da17d11787bb4016ecea5f143045f505d5e6705d182ec4365d19c9d03a7a5f0cdc0177a2a1c05a54b4dd0aa612aec55a949b4f42a8962dba0a2d984fc2d12951668030258b7e80fa3d4f2ad02448bf45d82c984a7eed2ec16d459ac653a0be9f48be700f04e9c03aa9bc1416693c5b004feaf890e02f849b0b980789dcf0ab678067079b133a05fe2cf12eb650a2a53c169d2fc1e9a10fea2e7273a064d44b9282f88bd4e02e7f10b767e0176b50c034cd9958022d89c3a05b17cbea400a1c282dd9d39b4bb059845a5b9e0255ee50d02c4a52ec14d26fa02cf56b3bc2f8182ff00527d829ead64052e3d3a481522e92f8744586ec2e71836068a672502fc27fdad4be02fe0585f013eca2c805f0e200bd348505fc34802f4f11668054d1742aa7ab77c4f8c0264c2e78944016504f14e60b00cd3f4a50345fa49b5805a78420267385b10cf40b8c88a07dae3277a7d40219c2cfb4c8263ab13d5bad02cde93ddad3b946cc195e7533b10814ba0267e05bf1933fec121e2ef3a59815982e71889910fe22c35800d9858099d74c13c5c60127a4fb5841595c6567f12405ca4d2e3370b7180605b834221d598c131d022469338fb04e91ac60ce3ed519ce206a2cc024ce49b6bf1338c52898c7abfa459ad833e18cccd59a27c81d4ce0e7abaca0445d13609b22c2020d33a0161165151318aa700b0e94a04ca7ad54d504584c550648b70614662cd3513ce889346f0be268349c3d5893e443a1a24c8a6ec3b9597d2631cd81226702df841210c662f5422459f24b941082ebe544f11afb4f417f89bc6569f8824b95e64b0e81946a1a15927d2e8d40222ff007279044b985598f94d01a82ebe4e026cce0eae94657ea1a6b40cc3aa008d63644548131827d827727abc3f32232a45513ab0c61758f504d7c22e7f5141487e8248b9c433bc74a8243a2cc02402284d935b699d4402e70b3078a2740fb129b2417584549764dad9c0139927d2f7d45088ba34224daf7c218c01f67bac17063209c58bac9318c0322f8b3009116e0d01f782e3e149399287522c4e64a248b2acc54049b6b06b1a0133822f89a0222fe2cf0121cfd5e7a77a093e5265a9f66b209332a4cae7a5c700318ce4d1670164485c53d04d78b8fc3f48022cd68c63ec124caf42807f175f20acc169a1084598c64980499ce49f47abf4513ecfb5ee13450a8b218c01368d4c19c404d92a9c4589ea6f2d6708a421f4baf92e01384f95d7c882670b8d1d3e81358213193c54d33845f0d027ab739347e02a64a026d4d018b3e517a0a9339c922e789ff626a1bcafd2c0678ab30920211ad2500347e0108b7e4b804e2356a7bbc0245e689b5f45484526b40cacd1010c60de3c5c652dca09eed4b8c0a26d66c3f410c62b5138090fc5e1dc8194e3513407482821f8787d007d07413a4ab3d013f82fa9d03ab0a504a1e2e8099c8b3ed39d031821f802422a00bd2e309f804c9b5ff6bc04892e5aa93140e1287380936b9e8681176008b09859700cff0017be121412784caf4fe822f48700ce138b69e826fa0a04ce490ce4fd04dae000bf29f6b984d6c13a4d2c5ba0489868e0244584c7c81dd2670d4fb2033e2c9838024ded643a00482f80caff00e89a3ec122c0c4170911b498c820b3ed0a438a9eadc044c90e9f4224c9569904a459a00f0ce16690108ba506618c5164f4130b9c6516dc03235304c4ff00d824abc39e9cd81d4fb5b4e020bd00ee385340264166813a7e346b209099e1f8771a04ab821f8070f4ba2fc81dc9c5890587da4f571d5ce268226708b3ecd089c2657eea6fc06a99e24fb59ae827a5868a0a599e2e77b4ee51b5b52538d63b019c61718f9c55bba5049f096accff000038b6b36971c06ac67a5dacb9ff00f6093fec9f0b9d2086f0bdca5f326f00b26ca5f9405a752ecdd14ffb1171910fc45d100268b16825cf0ce4bbd267a0a7d98f82c116fca6739f3099cad045c64c6f440289614178b9f966adc285fb3be22e0820b369f281b3fecbf4550e17daa9f48157a9e80a45a98c808b718ca02cca0b6814c602e453995950a026f0b8cfc97008b3464aa88a5d25ba80bdd4389fdd98ce4436baa94ee5156e3053cda63300d9a5bf29ab905fc2c4b16d02e497ff00e96201366f0b4a06e24dadd20133c3995d61150f4a1c154fc3192fda08bd4282fd9fa957f4084a43fbc0482d4802e71a3f0ee3407e816f281bce341828abc3bd4a505b50b8281f8855eaa26d61f8633f282e33f281409726f3c2e0fb1536a74f32225d267357c14d31d3a7d2ef18113761b16a29e7ea2a5d82cc99ca55ea8c9bce0319d88b8a6c5bf62876ecba30818ea673e14ee14436bc2dd0879fa1c50426dafb668173eaa55e024de9798339d320d693d29e9033af4f8294806d6c4a819c9765b84e78a2a95282ff0013c85fb2ef604d18cc5a9416a534017394590804f82001214ba40587a55fb0369cdada973e818abbf12a5053c29403653f40e6122d8680c657f195e01ed2fd2ed906b7129699e81b3ecfb3c0152fc173416a2f524ea2aee24295458228218d9737450ab3d4b0bf26b2156a74e1742133c3a500d9333452c008a97608b670e9430d8be08a9d4bb6afa9d54d0a52e816d3a9765d02a67a5a500e64f52ec153ab4b737390116a03494a5017794eaee22d486f0b728a87abfd4bf05d01d3852ec13198a6b2966816a7e9c5dc037c0c6568184ce2e4b000d9616e4021c4a04f17bc298e6601b2e7e0ba5e833d59a378c8043214049e8be402e7e438740a1403c87870e81a4500b0b427a0173c0b3206e74e96976070f1166b60078502fc174957f40e9c29c0366ca9320bbc642940fb3a54bb05972b52c4a043b727e141abae27a6325045de30785d02ca67112e4ce681d4de3263317a05367a505a9b5c1714133816a78085deca0297395f19b320b0297340abdc268be01e9c3c5452e936b52a8a87727a08b1179b10e274a505b0f53b9360d1f8973ead04c85d2505f4ea55c640de3f0e89682d290026724cc4ab41245f0ce50171c4b95a9e80b27522f00e17667280bb9537e2f4a094a136074ff652ec17366cc68a514f57e53be0810ce76b9cb3545e9ea5c9dc08b117e8bb02e0ba3313201f5859f692641bfe9117711b4f92af899d02dce345de0ef4a05431959412132b61d1195a99e9ea867376bfc45e6043863a9f8b3d156245b787503f32485c1413f70670b27ea026314f74d6a6d35f60713c9f6b69c113df93388bf6022f7d2632451218e8b009b339a8b202169e9e80bacf10c02fe112e296f014fcc983550427caf10153c5ceb10b1426ce6529b038b12e72be207122f4027da2fea017fa10936a18e9ccae3858827abff61412e88b949b5148998bd02619b32d77093621264e756ed6c456664b9c17abd02d499c2e309360559fe5318a28743198bace3a82730ba84d7500dacf949f0281c16044f5624504d2cd916a09f5ea45e808bd484aa2ca93385b0ee100eff10805c1b845ba03e8b348b010f4f0e28a95652208426d62891644c45d60116f8549b4171b3c21013b96a4da2d99153d2153d80422f1159d21d2202f321166052a67ab04105f9a975a03584a4ab34a84bc590e60a29cf0fe92910227e2f524e81e909f255446ad4cf801667e00d7009a4be2f126c16e8e9c00f4ee4976807b57a0044b8f86a6ba93c809c3c1a9ad8277068e1fa09fabf64d80680808d71387ba02ec09a03eb868ef4a06887fb201f8784d1281622c3e80e908b8e019c78866e480526c913fd82dc24cf57ecc700f1767e2598805d24df56e8b4089c3f166681fc27daf004903680b8c4f56e268359809a2f800926561ba017643d250213e0fe0022fd133804e34cc50389f82cd007a9f8d4809f88bc27c814228218e9e9cc81cf0526b40cebc526719e2c04f4d94f7605f8c94cf4808b26e90e809f4b9d1e0270995a5d01cd9bc98fb00da4f5af1267808b364990098c1f64b84de00b165fd21009131a37826c171538b09a05efda66608a09e23533f9aa9009f0498fb0045b8437905fb3e61b27c022dda673b3c05fb27a4e1e740f4b8f84ab3608b027c013b0fe18282754d60ba04ddab75a4504d4fb5ea4594045e1dc81e025053a7779201e27d29a0222f0c81e24f9cafe9de01a3c210088b3e08085daed201a3a10086711710c821031c05d9e14e0134955202f4e18c1f809f8b0f4ccc815059f00684d2e300917c33d34073082e809f2971d597080bea1005f3e09e9f89b03a5267185a0972bb0042eb8b14199e954021346cfd02a6d73840374993d5048b0e9ce824995bf67f746413d59769e2f41058022c22007daf3a4f804de4ce4f0990171b4f346005aace40c2f596bfe81327e2fe809d38ab013ec3e8ef05a5458821b54c7aa07a9eafa801845053f42e202e3ed6cca6c4696a5d1b3390a52a2c02e70521900bc0036710e88bae271669318aa2d2dc98c12229aa5d1f6641148016e4a26817a957099c00b134b7530a852f87f0c61013792cce850d45de22528349509a05ba422827f0cac35413a8d6b09aa0b4bf09b5e8255fc48a4045cc8c82f1a66af3d0268fd45a81cf0a6f24c2c0a5f0a7fd817e44ca0357e131da6971940a9ec5984d01ec5b53d5b14398d97152dcef26834b8c99cfd22887a5da2cf7d696
#使用
./test a.txt 10240 2

效果

a5 5a e5 13 56 30 30 30 30 30 31 32 30 32 30 31 34 31 39 30 34 05 cd 84 01 ff 13 00 0b 00 00 00 00 00 3d da 00 00 81 11 4a 7d 02 9f 62 22 af 91 28 b3 40 98 3d 36 b3 4a 24 ca c4 bd 2a 0b 19 6a 63 38 d1 9c 28 89 56 cf 0d 09 0b f6 53 3d 20 a4 f9 51 39 c0 39 92 e8 37 90 21 9c 45 be a5 ba 00 58 79 01 08 b3 ed 38 04 33 b1 39 9a 22 c9 d3 f7 d2 d0 0e 9e 00 a1 2a eb e1 20 42 42 1e a8 44 81 b2 68 17 db 93 86 33 a3 3c 41 0a 41 43 fa 7d 1e 99 10 0e 1e 8a 70 d2 a5 03 85 28 05 34 93 d5 10 ba 4d 2f d1 28 1c 4e f1 61 41 3d 5d 25 01 60 6f 60 a5 2d 21 c0 3f 43 3d 00 fd 16 b2 0b d3 e8 fc 20 1d 25 45 a2 19 49 b1 60 27 17 d3 86 34 06 8f f6 74 80 4d a7 0e 65 7a 06 b0 4d 27 56 cc 01 cc 16 95 3e c0 59 98 4f 69 d0 34 68 39 9d 01 a3 19 12 82 e8 d1 4d 50 0b a3 f1 28 2c 4e 61 76 4c e4 0e 84 cc 2c 01 16 c3 d1 51 68 68 0c 61 16 cc 68 9a 11 0d fc 2f 0e 81 29 84 5d 40 3b d3 46 78 63 f4 0e 69 28 74 17 fd 14 40 34 42 2e 81 05 20 1d 24 4f c5 f2 81 e9 4b 9c 92 0a 7a 75 6f 89 90 16 5d a6 97 9c 03 39 88 5d 80 1a 28 06 78 8b dc 65 04 52 66 18 e1 7e c1 05 20 24 5c 69 00 c5 d1 03 c1 51 74 80 8b 4e a7 ab c0 a9 22 d8 4a 98 c6 c1 6a 67 6b 36 9d 05 95 24 ca f0 94 10 81 d0 2a cf 49 9c 6d 3d 05 89 fa 53 d0 69 95 a8 11 76 9b ca f3 87 d8 43 89 17 d4 c8 2c 99 21 b2 cc 82 10 01 78 96 a2 e0 05 fd 4b b5 04 24 ca d3 3b 03 c4 16 fc 82 2f 0f 48 28 7b 7a 26 78 02 ed 2a f3 d1 12 1d ca cd 9a a0 44 b0 5c 02 2e 31 e9 34 6c 31 a9 36 4a 96 ad 88 da eb 09 a4 d8 0b a8 8b 0d 88 99 4f 17 d4 05 f0 e8 4d 80 6a 93 28 0b 70 07 00 e6 43 f4 d5 05 fa 4c f8 b0 9e 0a 7d 27 f1 73 8c 61 3d 05 d4 4b a8 5a 02 d4 d4 5b c4 c8 85 f8 32 8b c0 3b 84 5f 32 77 2b 43 ec e1 74 20 63 04 c7 82 63 40 d6 b1 84 5a ce 81 75 81 36 b5 40 89 fa be 82 2d e1 e7 10 82 96 e7 68 7a 82 f0 21 34 04 c1 0f 71 a5 90 12 86 80 43 19 da f5 31 98 0d 56 7d 54 05 f1 17 08 0b a4 cc 5f 13 99 01 af 6e 10 05 43 c5 ce 6c c0 a9 a4 f5 79 d2 dc 88 24 5a 77 aa 89 e2 c2 25 fa 41 75 8f c4 b8 c0 28 ba ca 69 72 95 05 93 a9 a2 9f 6a 2e 0b 72 94 a0 a9 0c ec fa 02 1e 1b 00 ba 2e 61 b0 0f 85 d2 45 20 9d 58 9c 5a 08 2d 4c 66 22 af a4 2d 2d 01 52 fc 14 10 ee 57 28 0b a2 5e 21 8c 81 fe c5 fb c2 59 80 31 d5 89 7e 96 e7 3a 03 29 ea 80 69 33 9a a4 9e 82 78 7b c3 c1 51 75 94 ba 5c 24 fb 40 f4 3f 11 46 ba 71 29 d0 5c 65 16 c2 d4 11 71 9f a4 50 5b 86 73 9a 5b 80 0b 8c 15 62 55 0a 10 e0 22 f5 2a e2 c1 0e 19 38 0b 11 51 67 d8 1e 0b 13 80 b7 05 c2 2e 01 3d da 2f a7 a0 8b d3 d2 e8 43 45 99 88 bf f6 07 ab a4 c7 d9 41 6a 11 65 c0 a9 74 2c 4a 01 61 49 9a 14 a5 21 48 51 53 05 00 2c 28 2e 36 9c 5f 35 92 d0 48 7a 74 a0 6b c4 b7 2a 5c 08 1f 28 be 0a b4 9a 4a b7 1e 20 9f 85 d8 5c e7 2a 1f 65 45 e0 07 0b 4a 05 da dd 26 36 70 17 f3 26 b0 9a 01 73 22 43 18 a7 d7 a0 2d d0 80 01 9c 40 3c 4f e2 e0 08 a9 42 01 57 98 4b b2 80 52 9f a4 2a d8 5c 32 a1 4b 92 9e 90 0e 9c 45 05 ba 4c 11 78 09 bd 8b f6 9d c8 05 38 78 07 d9 56 44 fa 00 a2 d9 bc 02 50 20 01 f4 93 f4 41 4b 34 5d 80 64 41 54 c1 0e 01 61 48 a0 5f 82 fc a2 dc 20 9c 33 9a 13 40 53 fe 88 28 9c 5a 4b d2 6c 44 fd 5f 49 a4 e0 28 6d 05 55 42 ec 0a 68 9b 26 84 39 90 ea 02 d4 22 82 2f 31 11 a0 4a 52 10 55 e6 11 52 a0 68 d1 0f 54 0f b3 d0 0b b3 28 02 db 84 fe 1f 8a 21 de a5 99 59 a2 02 74 5f 13 d0 5c 64 bb 49 72 50 5b 34 5d 22 c0 45 ee 08 80 55 a7 a8 0b 4a 99 50 3e f0 75 14 0d 22 dc 44 e8 2a 75 66 92 02 d3 48 b4 0b b3 42 02 d2 44 3f 41 6a f8 9d 3c 14 d1 e0 78 06 b2 6f d4 04 d5 d1 fc 45 a0 5c 7c 14 ba 38 09 42 1a 05 ef 15 2f c2 50 58 6b 21 fc 03 9a 31 8a 6d 01 75 8c 94 fa 20 25 53 85 d8 16 1f d3 d4 b3 20 a5 4d e4 15 55 9a b7 41 40 a7 00 a5 d9 53 b9 e8 8b a0 9b d9 98 02 16 65 40 45 e9 28 b1 0e 2c 38 08 b7 61 c0 32 8a 77 a2 6a 2d 09 b0 42 ae 49 a0 2d 26 32 63 07 00 c9 4e ac 98 06 57 08 63 40 d6 52 52 80 8b a3 d2 82 29 29 cc 8a 61 53 47 40 41 60 16 99 39 82 82 29 a4 9a 10 c9 0b 54 12 2e 8f 09 b0 4e e5 7f 4e 1c 02 22 dd 1f 60 70 b5 3f 5a a0 97 09 71 90 d8 00 01 b8 b8 38 01 34 8b 4b 72 06 32 5d a6 32 60 1a 80 54 69 7f 52 ad a8 06 f2 53 ec 9f 00 1a 29 00 b8 2c 10 1a b8 4a 98 cc 5c 64 0a b6 e5 0e d0 3a 26 d6 02 99 ce d2 c2 ec 55 ef 53 39 0b b0 46 b1 33 d6 56 64 45 e2 48 4f b3 38 02 98 9e 9c a0 1a c0 9d 50 0c e4 fa 40 5f 08 94 a0 67 35 50 51 6e 0b f4 85 d0 1f 79 ca a7 74 a2 26 7a 74 ce 0f 01 ae 33 e9 57 ec 05 cb 3e aa 2a e9 33 93 f8 5b 80 4f d5 9f 49 77 b5 10 08 70 50 87 50 1a 4e a2 d0 33 a2 ec a8 0a 78 80 2d d2 2a 01 9f b2 dd 05 ce 15 16 44 a5 c9 90 5c 19 ca 59 84 be 85 50 f4 05 e9 30 54 bf 20 b3 18 c5 22 5b a2 fd 20 45 4b bd 1d 51 7c fb 4c 14 a0 b7 42 53 00 b9 d2 2e 6f 72 98 c5 03 85 f8 3c 00 0a bb f3 d0 41 72 88 ab a8 20 0b d3 09 40 11 a9 c3 9a c2 a2 71 7f 12 ec a0 bf 89 7e 4b 4f 00 2c 45 05 4f 4b 92 e7 a0 bb a9 e8 20 bf 44 d2 2e 32 a2 73 2a 97 65 c8 2a 68 a6 f3 91 05 4a 82 ad f9 2f c0 50 2f 56 5f 10 d8 08 a5 03 a1 4c 80 4d 80 11 78 94 bb 05 ef 4f c4 ab 9d e2 a0 65 2d 33 9d 15 45 3f 89 4b 71 b0 5b 0b 59 01 7f f4 7d af e2 4d 81 73 56 d4 e9 9b f8 21 f4 1e 80 1e 97 29 72 0b 4a 9e 2d 05 b5 32 10 0c 61 6e e2 59 94 bb 05 35 61 53 f4 0b e4 59 a2 14 04 a0 0a a9 4e 81 7f a1 c4 a0 b7 7a 3a 9f 4b c0 0c e7 e1 2e cd e4 16 88 b7 41 57 49 c3 7f 45 d8 b4 bb 09 0f b0 a4 df 02 ec bf 42 13 d4 5b 40 30 73 85 fa 01 68 9d 2e 85 a5 34 14 0b 0b f4 5d 80 6c fd 2a 50 aa 64 fb 2d 0a 7d 86 33 a8 6c 42 7b 09 78 73 34 a0 43 89 72 bf 60 7a 53 d4 a0 bf 65 fa 2a 02 df 83 da 59 e2 8a 5f 53 a5 d1 c0 46 ba ca d0 58 9e d2 97 61 a5 2c c2 17 39 11 69 74 52 fa 09 1a ac da b9 c0 19 3c e2 18 05 fa 0f e8 29 49 b4 5a 21 4a 54 05 4a bf a9 fc 05 a7 7d 01 57 29 0e 17 20 5f 0d a1 7d 11 78 7b b4 01 6e ce a5 f1 43 04 5f 50 5d 5e 67 05 d1 82 ec 43 65 d1 9c 9d 03 a7 a5 f0 cd c0 17 7a 2a 1c 05 a5 4b 4d d0 aa 61 2a ec 55 a9 49 b4 f4 2a 89 62 db a0 a2 d9 84 fc 2d 12 95 16 68 03 02 58 b7 e8 0f a3 d4 f2 ad 02 44 8b f4 5d 82 c9 84 a7 ee d2 ec 16 d4 59 ac 65 3a 0b e9 f4 8b e7 00 f0 4e 9c 03 aa 9b c1 41 66 93 c5 b0 04 fe af 89 0e 02 f8 49 b0 b9 80 78 9d cf 0a b6 78 06 70 79 b1 33 a0 5f e2 cf 12 eb 65 0a 2a 53 c1 69 d2 fc 1e 9a 10 fe a2 e7 27 3a 06 4d 44 b9 28 2f 88 bd 4e 02 e7 f1 0b 76 7e 01 76 b5 0c 03 4c d9 95 80 22 d8 9c 3a 05 b1 7c be a4 00 a1 c2 82 dd 9d 39 b4 bb 05 98 45 a5 b9 e0 25 5e e5 0d 02 c4 a5 2e c1 4d 26 fa 02 cf 56 b3 bc 2f 81 82 ff 00 52 7d 82 9e ad 64 05 2e 3d 3a 48 15 22 e9 2f 87 44 58 6e c2 e7 18 36 06 8a 67 25 02 fc 27 fd ad 4b e0 2f e0 58 5f 01 3e ca 2c 80 5f 0e 20 0b d3 48 50 5f c3 48 02 f4 f1 16 68 05 4d 17 42 aa 7a b7 7c 4f 8c 02 64 c2 e7 89 44 01 65 04 f1 4e 60 b0 0c d3 f4 a5 03 45 fa 49 b5 80 5a 78 42 02 67 38 5b 10 cf 40 b8 c8 8a 07 da e3 27 7a 7d 40 21 9c 2c fb 4c 82 63 ab 13 d5 ba d0 2c de 93 dd ad 3b 94 6c c1 95 e7 53 3b 10 81 4b a0 26 7e 05 bf 19 33 fe c1 21 e2 ef 3a 59 81 59 82 e7 18 89 91 0f e2 2c 35 80 0d 98 58 09 9d 74 c1 3c 5c 60 12 7a 4f b5 84 15 95 c6 56 7f 12 40 5c a4 d2 e3 37 0b 71 80 60 5b 83 42 21 d5 98 c1 31 d0 22 46 93 38 fb 04 e9 1a c6 0c e3 ed 51 9c e2 06 a2 cc 02 4c e4 9b 6b f1 33 8c 52 89 8c 7a bf a4 59 ad 83 3e 18 cc cd 59 a2 7c 81 d4 ce 0e 7a ba ca 04 45 d1 36 09 b2 2c 20 20 d3 3a 01 61 16 51 51 31 8a a7 00 b0 e9 4a 04 ca 7a d5 4d 50 45 84 c5 50 64 8b 70 61 46 62 cd 35 13 ce 88 93 46 f0 be 26 83 49 c3 d5 89 3e 44 3a 1a 24 c8 a6 ec 3b 95 97 d2 63 1c d8 12 26 70 2d f8 41 21 0c 66 2f 54 22 45 9f 24 b9 41 08 2e be 54 4f 11 af b4 f4 17 f8 9b c6 56 9f 88 24 b9 5e 64 b0 e8 19 46 a1 a1 59 27 d2 e8 d4 02 22 ff 00 72 79 04 4b 98 55 98 f9 4d 01 a8 2e be 4e 02 6c ce 0e ae 94 65 7e a1 a6 b4 0c c3 aa 00 8d 63 64 45 48 13 18 27 d8 27 72 7a bc 3f 32 23 2a 45 51 3a b0 c6 17 58 f5 04 d7 c2 2e 7f 51 41 48 7e 82 48 b9 c4 33 bc 74 a8 24 3a 2c c0 24 02 28 4d 93 5b 69 9d 44 02 e7 0b 30 78 a2 74 0f b1 29 b2 41 75 84 54 97 64 da d9 c0 13 99 27 d2 f7 d4 50 88 ba 34 22 4d af 7c 21 8c 01 f6 7b ac 17 06 32 09 c5 8b ac 93 18 c0 32 2f 8b 30 09 11 6e 0d 01 f7 82 e3 e1 49 39 92 87 52 2c 4e 64 a2 48 b2 ac c5 40 49 b6 b0 6b 1a 01 33 82 2f 89 a0 22 2f e2 cf 01 21 cf d5 e7 a7 7a 09 3e 52 65 a9 f6 6b 20 93 32 a4 ca e7 a5 c7 00 31 8c e4 d1 67 01 64 48 5c 53 d0 4d 78 b8 fc 3f 48 02 2c d6 8c 63 ec 12 4c af 42 80 7f 17 5f 20 ac c1 69 a1 08 45 98 c6 49 80 49 9c e4 9f 47 ab f4 51 3e cf b5 ee 13 45 0a 8b 21 8c 01 36 8d 4c 19 c4 04 d9 2a 9c 45 89 ea 6f 2d 67 08 a4 21 f4 ba f9 2e 01 38 4f 95 d7 c8 82 67 0b 8d 1d 3e 81 35 82 13 19 3c 54 d3 38 45 f0 d0 27 ab 73 93 47 e0 2a 64 a0 26 d4 d0 18 b3 e5 17 a0 a9 33 9c 92 2e 78 9f f6 26 a1 bc af d2 c0 67 8a b3 09 20 21 1a d2 50 03 47 e0 10 8b 7e 4b 80 4e 23 56 a7 bb c0 24 5e 68 9b 5f 45 48 45 26 b4 0c ac d1 01 0c 60 de 3c 5c 65 2d ca 09 ee d4 b8 c0 a2 6d 66 c3 f4 10 c6 2b 51 38 09 0f c5 e1 dc 81 94 e3 51 34 07 48 28 21 f8 78 7d 00 7d 07 41 3a 4a b3 d0 13 f8 2f a9 d0 3a b0 a5 04 a1 e2 e8 09 9c 8b 3e d3 9d 03 18 21 f8 02 42 2a 00 bd 2e 30 9f 80 4c 9b 5f f6 bc 04 89 2e 5a a9 31 40 e1 28 73 80 93 6b 9e 86 81 17 60 08 b0 98 59 70 0c ff 00 17 be 12 14 12 78 4c af 4f e8 22 f4 87 00 ce 13 8b 69 e8 26 fa 0a 04 ce 49 0c e4 fd 04 da e0 00 bf 29 f6 b9 84 d6 c1 3a 4d 2c 5b a0 48 98 68 e0 24 45 84 c7 c8 1d d2 67 0d 4f b2 03 3e 2c 98 38 02 4d ed 64 3a 00 48 2f 80 ca ff 00 e8 9a 3e c1 22 c0 c4 17 09 11 b4 98 c8 20 b3 ed 0a 43 8a 9e ad c0 44 c9 0e 9f 42 24 c9 56 99 04 a4 59 a0 0f 0c e1 66 90 10 8b a5 06 61 8c 51 64 f4 13 0b 9c 65 16 dc 03 23 53 04 c4 ff 00 d8 24 ab c3 9e 9c d8 1d 4f b5 b4 e0 20 bd 00 ee 38 53 40 26 41 66 81 3a 7e 34 6b 20 90 99 e1 f8 77 1a 04 ab 82 1f 80 70 f4 ba 2f c8 1d c9 c5 89 05 87 da 4f 57 1d 5c e2 68 22 67 08 b3 ec d0 89 c2 65 7e ea 6f c0 6a 99 e2 4f b5 9a e8 27 a5 86 8a 0a 59 9e 2e 77 b4 ee 51 b5 b5 25 38 d6 3b 01 9c 61 71 8f 9c 55 bb a5 04 9f 09 6a cc ff 00 00 38 b6 b3 69 71 c0 6a c6 7a 5d ac b9 ff 00 f6 09 3f ec 9f 0b 9d 20 86 f0 bd ca 5f 32 6f 00 b2 6c a5 f9 40 5a 75 2e cd d1 4f fb 11 71 91 0f c4 5d 10 02 68 b1 68 25 cf 0c e4 bb d2 67 a0 a7 d9 8f 82 c1 16 fc a6 73 9f 30 99 ca d0 45 c6 4c 6f 44 02 89 61 41 78 b9 f9 66 ad c2 85 fb 3b e2 2e 08 20 b3 69 f2 81 b3 fe cb f4 55 0e 17 da a9 f4 81 57 a9 e8 0a 45 a9 8c 80 8b 71 8c a0 2c ca 0b 68 14 c6 02 e4 53 99 59 50 a0 26 f0 b8 cf c9 70 08 b3 46 4a a8 8a 5d 25 ba 80 bd d4 38 9f dd 98 ce 44 36 ba a9 4e e5 15 6e 30 53 cd a6 33 00 d9 a5 bf 29 ab 90 5f c2 c4 b1 6d 02 e4 97 ff 00 e9 62 01 36 6f 0b 4a 06 e2 4d ad d2 01 33 c3 99 5d 61 15 0f 4a 1c 15 4f c3 19 2f da 08 bd 42 82 fd 9f a9 57 f4 08 4a 43 fb c0 48 2d 48 02 e7 1a 3f 0e e3 40 7e 81 6f 28 1b ce 34 18 28 ab c3 bd 4a 50 5b 50 b8 28 1f 88 55 ea a2 6d 61 f8 63 3f 28 2e 33 f2 81 40 97 26 f3 c2 e0 fb 15 36 a7 4f 32 22 5d 26 73 57 c1 4d 31 d3 a7 d2 ef 18 11 37 61 b1 6a 29 e7 ea 2a 5d 82 cc 99 ca 55 ea 8c 9b ce 03 19 d8 8b 8a 6c 5b f6 28 76 ec ba 30 81 8e a6 73 e1 4e e1 44 36 bc 2d d0 87 9f a1 c5 04 26 da fb 66 81 73 ea a5 5e 02 4d e9 79 83 39 d3 20 d6 93 d2 9e 90 33 af 4f 82 94 80 6d 6c 4a 81 9c 97 65 b8 4e 78 a2 a9 52 82 ff 00 13 c8 5f b2 ef 60 4d 18 cc 5a 94 16 a5 34 01 73 94 59 08 04 f8 20 01 21 4b a4 05 87 a5 5f b0 36 9c da da 97 3e 81 8a bb f1 2a 50 53 c2 94 03 65 3f 40 e6 12 2d 86 80 c6 57 f1 95 e0 1e d2 fd 2e d9 06 b7 12 96 99 e8 1b 3e cf b3 c0 15 2f c1 73 41 6a 2f 52 4e a2 ae e2 42 95 45 82 28 21 8d 97 37 45 0a b3 d4 b0 bf 26 b2 15 6a 74 e1 74 21 33 c3 a5 00 d9 33 34 52 c0 08 a9 76 08 b6 70 e9 43 0d 8b e0 8a 9d 4b b6 af a9 d5 4d 0a 52 e8 16 d3 a9 76 5d 02 a6 7a 5a 50 0e 64 f5 2e c1 53 ab 4b 73 73 90 11 6a 03 49 4a 50 17 79 4e ae e2 2d 48 6f 0b 72 8a 87 ab fd 4b f0 5d 01 d3 85 2e c1 31 98 a6 b2 96 68 16 a7 e9 c5 dc 03 7c 0c 65 68 18 4c e2 e4 b0 00 d9 61 6e 40 21 c4 a0 4f 17 bc 29 8e 66 01 b2 e7 e0 ba 5e 83 3d 59 a3 78 c8 04 32 14 04 9e 8b e4 02 e7 e4 38 74 0a 14 03 c8 78 70 e8 1a 45 00 b0 b4 27 a0 17 3c 0b 32 06 e7 4e 96 97 60 70 f1 16 6b 60 07 85 02 fc 17 49 57 f4 0e 9c 29 c0 36 6c a9 32 0b bc 64 29 40 fb 3a 54 bb 05 97 2b 52 c4 a0 43 b7 27 e1 41 ab ae 27 a6 32 50 45 de 30 78 5d 02 ca 67 11 2e 4c e6 81 d4 de 32 63 31 7a 05 36 7a 50 5a 9b 5c 17 14 13 38 16 a7 80 85 de ca 02 97 39 5f 19 b3 20 b0 29 73 40 ab dc 26 8b e0 1e 9c 3c 54 52 e9 36 b5 2a 8a 87 72 7a 08 b1 17 9b 10 e2 74 a5 05 b0 f5 3b 93 60 d1 f8 97 3e ad 04 c8 5d 25 05 f4 ea 55 c6 40 de 3f 0e 89 68 2d 29 00 26 72 4c c4 ab 41 24 5f 0c e5 01 71 c4 b9 5a 9e 80 b2 75 22 f0 0e 17 66 72 80 bb 95 37 e2 f4 a0 94 a1 36 07 4f f6 52 ec 17 36 6c c6 8a 51 4f 57 e5 3b e0 81 0c e7 6b 9c b3 54 5e 9e a5 c9 dc 08 b1 17 e8 bb 02 e0 ba 33 13 20 1f 58 59 f6 92 64 1b fe 91 17 71 1b 4f 92 af 89 9d 02 dc e3 45 de 0e f4 a0 54 31 95 94 12 13 2b 61 d1 19 5a 99 e9 ea 86 73 76 bf c4 5e 60 43 86 3a 9f 8b 3d 15 62 45 b7 87 50 3f 32 48 5c 14 13 f7 06 70 b2 7e a0 26 31 4f 74 d6 a6 d3 5f 60 71 3c 9f 6b 69 c1 13 df 93 38 8b f6 02 2f 7d 26 32 45 12 18 e8 b0 09 b3 39 a8 b2 02 16 9e 9e 80 ba cf 10 c0 2f e1 12 e2 96 f0 14 fc c9 83 55 04 27 ca f1 01 53 c5 ce b1 0b 14 26 ce 65 29 b0 38 b1 2e 72 be 20 71 22 f4 02 7d a2 fe a0 17 fa 10 93 6a 18 e9 cc ae 38 58 82 7a bf f6 14 12 e8 8b 94 9b 51 48 99 8b d0 26 19 b3 2d 77 09 36 21 26 4e 75 6e d6 c4 56 66 4b 9c 17 ab d0 2d 49 9c 2e 30 93 60 55 9f e5 31 8a 28 74 31 98 ba ce 3a 82 73 0b a8 4d 75 00 da cf 94 9f 02 81 c1 60 44 f5 62 45 04 d2 cd 91 6a 09 f5 ea 45 e8 08 bd 48 4a a2 ca 93 38 5b 0e e1 00 ef f1 08 05 c1 b8 45 ba 03 e8 b3 48 b0 10 f4 f0 e2 8a 95 65 22 08 42 6d 62 89 16 44 c4 5d 60 11 6f 85 49 b4 17 1b 3c 21 01 3b 96 a4 da 2d 99 15 3d 21 53 d8 04 22 f1 15 9d 21 d2 20 2f 32 11 66 05 2a 67 ab 04 10 5f 9a 97 5a 03 58 4a 4a b3 4a 84 bc 59 0e 60 a2 9c f0 fe 92 91 02 27 e2 f5 24 e8 1e 90 9f 25 54 46 ad 4c f8 01 66 7e 00 d7 00 9a 4b e2 f1 26 c1 6e 8e 9c 00 f4 ee 49 76 80 7b 57 a0 04 4b 8f 86 a6 ba 93 c8 09 c3 c1 a9 ad 82 77 06 8e 1f a0 9f ab f6 4d 80 68 08 08 d7 13 87 ba 02 ec 09 a0 3e b8 68 ef 4a 06 88 7f b2 01 f8 78 4d 12 81 62 2c 3e 80 e9 08 b8 e0 19 c7 88 66 e4 80 52 6c 91 3f d8 2d c2 4c f5 7e cc 70 0f 17 67 e2 59 88 05 d2 4d f5 6e 8b 40 89 c3 f1 66 68 1f c2 7d af 00 49 03 68 0b 8c 4f 56 e2 68 35 98 09 a2 f8 00 92 65 61 ba 01 76 43 d2 50 21 3e 0f e0 02 2f d1 33 80 4e 34 cc 50 38 9f 82 cd 00 7a 9f 8d 48 09 f8 8b c2 7c 81 42 28 21 8e 9e 9c c8 1c f0 52 6b 40 ce bc 52 67 19 e2 c0 4f 4d 94 f7 60 5f 8c 94 cf 48 08 b2 6e 90 e8 09 f4 b9 d1 e0 27 09 95 a5 d0 1c d9 bc 98 fb 00 da 4f 5a f1 26 78 08 b3 64 99 00 98 c1 f6 4b 84 de 00 b1 65 fd 21 00 91 31 a3 78 26 c1 71 53 8b 09 a0 5e fd a6 66 08 a0 9e 23 53 3f 9a a9 00 9f 04 98 fb 00 45 b8 43 79 05 fb 3e 61 b2 7c 02 2d da 67 3b 3c 05 fb 27 a4 e1 e7 40 f4 b8 f8 4a b3 60 8b 02 7c 01 3b 0f e1 82 82 75 4d 60 ba 04 dd ab 75 a4 50 4d 4f b5 ea 45 94 04 5e 1d c8 1e 02 50 53 a7 77 92 01 e2 7d 29 a0 22 2f 0c 81 e2 4f 9c af e9 de 01 a3 c2 10 08 8b 3e 08 08 5d ae d2 01 a3 a1 00 86 71 17 10 c8 21 03 1c 05 d9 e1 4e 01 34 95 52 02 f4 e1 8c 1f 80 9f 8b 0f 4c cc 81 50 59 f0 06 84 d2 e3 00 91 7c 33 d3 40 73 08 2e 80 9f 29 71 d5 97 08 0b ea 10 05 f3 e0 9e 9f 89 b0 3a 52 67 18 5a 09 72 bb 00 42 eb 8b 14 19 9e 95 40 21 34 6c fd 02 a6 d7 38 40 37 49 93 d5 04 8b 0e 9c e8 24 99 5b f6 7f 74 64 13 d5 97 69 e2 f4 10 58 02 2c 22 00 7d af 3a 4f 80 4d e4 ce 4f 09 90 17 1b 4f 34 60 05 aa ce 40 c2 f5 96 bf e8 13 27 e2 fe 80 9d 38 ab 01 3e c3 e8 ef 05 a5 45 88 21 b5 4c 7a a0 7a 9e af a8 01 84 50 53 f4 2e 20 2e 3e d6 cc a6 c4 69 6a 5d 1b 33 90 a5 2a 2c 02 e7 05 21 90 0b c0 03 67 10 e8 8b ae 27 16 69 31 8a a2 d2 dc 98 c1 22 29 aa 5d 1f 66 41 14 80 16 e4 a2 68 17 a9 57 09 9c 00 b1 34 b7 53 0a 85 2f 87 f0 c6 10 13 79 2c ce 85 0d 45 de 22 52 83 49 50 9a 05 ba 42 28 27 f0 ca c3 54 13 a8 d6 b0 9a a0 b4 bf 09 b5 e8 25 5f c4 8a 40 45 cc 8c 82 f1 a6 6a f3 d0 26 8f d4 5a 81 cf 0a 6f 24 c2 c0 a5 f0 a7 fd 81 7e 44 ca 03 57 e1 31 da 69 71 94 0a 9e c5 98 4d 01 ec 5b 53 d5 b1 43 98 d9 71 52 dc ef 26 83 4b 8c 99 cf d2 28 87 a5 da 2c f7 d6 96

猜你喜欢

转载自blog.csdn.net/weixin_42892101/article/details/108969182