[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

文本显示、行显、日志跟随监控工具TL.EXE

本帖最后由 happy886rr 于 2016-10-20 20:13 编辑

[Version2.0]修复7个漏洞,优化CPU占用率到3%以下,修复fgetws统计行数问题,增加强制跟随模式直接用-d开关无参数即可以进入。完全取代more、type、tail的强悍工具,支持数GB乃至TB级的超大文本,瞬间读取任意位置。代码继续精简了20行。可执行文件体积仅12KB。
下载地址:把下面图片存为a.zip解压即是。

具体用法:
  1. TL.EXE
  2. __________________________________________________________________________
  3. 完全取代more、type、tail的强悍工具,采用64位流指针,支持数GB的超大文本,
  4. 瞬间读取任意位置。
  5. 智能识别文本编码,支持定义添加任意国编码识别框架,自动判断BOM类型。原生支持
  6. ANSI、UTF8、Unicode、Unicode big endian、BIG5台湾编码。准确识别有无BOM类型、
  7. 可自定义行长、编码检测阈、跟随阈。
  8. 支持按行读取、按百分比读取。瞬移指针,无等待。 实时侦测文件末端最新行的改变,
  9. 最大可支持数TB巨型日志。时间仓促,仅在WIN7企业版32位下测试,其它系统请自行
  10. 测试、酌情试配。
  11. __________________________________________________________________________
  12. 文本显示、行显、日志跟随监控工具, 版本 2.0
  13. COPYRIGHT@2016~2018 BY HAPPY
  14. 使用:
  15. tl  [file] [-n&num1,num2]|[-p&per1,per2]|[-i]|[-d&num]
  16. __________________________________________________________________________
  17. 选项:
  18. -h    显示帮助信息
  19. -n    读取第num1行到第num2行的内容
  20. -p    按百分比读取文件内容从per1到per2,注:取值为[0,1]内的小数
  21. -i    显示文本的行数、文件大小
  22. -d    侦测文件的最新num行,静态显示
  23. -d    无参数则采取强制跟随策略,即毫秒跟随,动态显示
  24. 空    无开关则读取整个文件,支持7种编码
  25. __________________________________________________________________________
  26. 示例:
  27.          tl a.txt                      //显示a.txt文本内容;
  28.          tl a.txt -i                   //显示a.txt行数及文件大小;
  29.          tl a.txt -n3                  //从第3行读到结尾;
  30.          tl a.txt -n3,5                //从第3行读到第5行;
  31.          tl a.txt -p0.618,0.798        //显示文件的百分之几的内容
  32.          tl a.txt -d15                 //侦测文件最新15行的变动,按Q键中断
  33.          tl a.txt -d                   //强制跟随文件变动,毫秒级响应
  34. __________________________________________________________________________
复制代码
核心代码:
  1. /*
  2. DISPLAYS THE CONTENTS OF A TEXT FILE, VERSION 2.0
  3. COPYRIGHT@2016~2018 BY HAPPY
  4. */
  5. #include   <stdio.h>
  6. #include   <conio.h>
  7. #include  <locale.h>
  8. #include <stdbool.h>
  9. #include    <time.h>
  10. #include <windows.h>
  11. //定义标准行长(字节)
  12. #define BUFF_SIZE 4096
  13. //编码检测阈值(字节)
  14. #define CHECK_SIZE 16383
  15. //文件跟随阈值(行)
  16. #define FOLLOW_SIZE 1000
  17. //强制跟随行数(行)
  18. #define FOLLOW_LINE 3
  19. //跟随等待计时(毫秒)
  20. #define FOLLOW_WAIT 20
  21. /***************转码函数群***************/
  22. //Unicode 转Ansi
  23. char* UnicodeToANSI(const wchar_t* Str)
  24. {
  25. int L=WideCharToMultiByte(CP_ACP, 0, Str, -1, NULL, 0, NULL, NULL);
  26. char* Out=(char *)calloc(L+1, sizeof(char));
  27. WideCharToMultiByte(CP_ACP, 0, Str, -1, Out, L, NULL, NULL);
  28. return Out;
  29. }
  30. //UTF8 转换成 Unicode
  31. wchar_t* UTF8ToUnicode(const char* Str)
  32. {
  33. int L=MultiByteToWideChar(CP_UTF8, 0, Str,-1, NULL, 0);
  34. wchar_t* Out=(wchar_t *)calloc(L+1, sizeof(wchar_t));
  35. MultiByteToWideChar(CP_UTF8, 0, Str, -1, (LPWSTR)Out, L);
  36. return Out;
  37. }
  38. //BIG5 转换成 Unicode
  39. wchar_t* BIG5ToUnicode(const char* Str)
  40. {
  41. int L=MultiByteToWideChar(950, 0, Str,-1, NULL, 0);
  42. wchar_t* Out=(wchar_t *)calloc(L+1, sizeof(wchar_t));
  43. MultiByteToWideChar(950, 0, Str, -1, (LPWSTR)Out, L);
  44. return Out;
  45. }
  46. /***************编码检测群***************/
  47. //判断utf8无BOM
  48. bool isUTF8(const char* Str)
  49. {
  50. if(!Str){
  51. return false;
  52. }
  53. const unsigned char* bytes=(const unsigned char *)Str;
  54. while(*bytes){
  55. if(
  56. (
  57. bytes[0]<=0x7F ||
  58. bytes[0]==0x09 ||
  59. bytes[0]==0x0A ||
  60. bytes[0]==0x0D ||
  61. (0x20<=bytes[0] && bytes[0]<=0x7E)
  62. )
  63. ){
  64. bytes+=1;
  65. continue;
  66. }
  67. if(
  68. (
  69. (0xC2<=bytes[0] && bytes[0]<=0xDF) &&
  70. (0x80<=bytes[1] && bytes[1]<=0xBF)
  71. )
  72. ){
  73. bytes+=2;
  74. continue;
  75. }
  76. if(
  77. (
  78.   (bytes[0]==0xE0) &&
  79. (0xA0<=bytes[1] && bytes[1]<=0xBF) &&
  80. (0x80<=bytes[2] && bytes[2]<=0xBF)
  81. ) ||
  82. (
  83. (
  84. (0xE1<=bytes[0] && bytes[0]<=0xEC)||
  85.                    bytes[0]==0xEE ||
  86.                    bytes[0]==0xEF
  87. ) &&
  88. (0x80<=bytes[1] && bytes[1]<=0xBF) &&
  89. (0x80<=bytes[2] && bytes[2]<=0xBF)
  90. ) ||
  91. (
  92.   (bytes[0]==0xED) &&
  93. (0x80<=bytes[1] && bytes[1]<=0x9F) &&
  94. (0x80<=bytes[2] && bytes[2]<=0xBF)
  95. )
  96. ){
  97. bytes+=3;
  98. continue;
  99. }
  100. if(
  101. (
  102.   (bytes[0]==0xF0) &&
  103. (0x90<=bytes[1] && bytes[1]<=0xBF) &&
  104. (0x80<=bytes[2] && bytes[2]<=0xBF) &&
  105. (0x80<=bytes[3] && bytes[3]<=0xBF)
  106. ) ||
  107. (
  108. (0xF1<=bytes[0] && bytes[0]<=0xF3) &&
  109. (0x80<=bytes[1] && bytes[1]<=0xBF) &&
  110. (0x80<=bytes[2] && bytes[2]<=0xBF) &&
  111. (0x80<=bytes[3] && bytes[3]<=0xBF)
  112. ) ||
  113. (
  114.   (bytes[0]==0xF4) &&
  115. (0x80<=bytes[1] && bytes[1]<=0x8F) &&
  116. (0x80<=bytes[2] && bytes[2]<=0xBF) &&
  117. (0x80<=bytes[3] && bytes[3]<=0xBF)
  118. )
  119. ){
  120. bytes+=4;
  121. continue;
  122. }
  123. return false;
  124. }
  125. return true;
  126. }
  127. //判断GB2312
  128. bool isGB2312(const char* Str)
  129. {
  130. if(!Str){
  131. return false;
  132. }
  133. const unsigned char* bytes=(const unsigned char *)Str;
  134. while(*bytes){
  135. if(
  136. (
  137. bytes[0]<=0x7F ||
  138. bytes[0]==0x09 ||
  139. bytes[0]==0x0A ||
  140. bytes[0]==0x0D ||
  141. (0x20<=bytes[0] && bytes[0]<=0x7E)
  142. )
  143. ){
  144. bytes+=1;
  145. continue;
  146. }
  147. if(
  148. (0xA1<=bytes[0] && bytes[0]<=0xF7) &&
  149. (0xA1<=bytes[1] && bytes[1]<=0xFE)
  150. ){
  151. bytes+=2;
  152. continue;
  153. }
  154. return false;
  155. }
  156. return true;
  157. }
  158. /*判断BIG5*/
  159. bool isBIG5(const char* Str)
  160. {
  161. if(!Str){
  162. return false;
  163. }
  164. const unsigned char* bytes=(const unsigned char *)Str;
  165. while(*bytes){
  166. if(
  167. (
  168. bytes[0]<=0x7F ||
  169. bytes[0]==0x09 ||
  170. bytes[0]==0x0A ||
  171. bytes[0]==0x0D ||
  172. (0x20<=bytes[0] && bytes[0]<=0x7E)
  173. )
  174. ){
  175. bytes+=1;
  176. continue;
  177. }
  178. if(
  179. (0xA1<=bytes[0] && bytes[0]<=0xF9) &&
  180. (
  181. (0x40<=bytes[1] && bytes[1]<=0x7E) ||
  182. (0xA1<=bytes[1] && bytes[1]<=0xFE)
  183. )
  184. ){
  185. bytes+=2;
  186. continue;
  187. }
  188. return false;
  189. }
  190. return true;
  191. }
  192. //判断文件BOM  
  193. int CheckBom(FILE* fp)
  194. {
  195. unsigned char* buf=(unsigned char*)calloc(3,sizeof(unsigned char));
  196. unsigned char* buf2;
  197. fseeko64(fp, (__int64)0, SEEK_SET);
  198. fread(buf, sizeof(unsigned char), 3, fp);
  199.      if(buf[0]==0xEF && buf[1]==0xBB && buf[2]==0xBF){return 3;}
  200. else if(buf[0]==0xFF && buf[1]==0xFE){return 5;}
  201. else if(buf[0]==0xFE && buf[1]==0xFF){return 6;}
  202. else{
  203. fseeko64(fp, (__int64)0, SEEK_SET);
  204. buf2=(unsigned char*)calloc(CHECK_SIZE,sizeof(unsigned char));
  205. fread(buf2, sizeof(unsigned char), CHECK_SIZE, fp);
  206. if(isUTF8(buf2)){
  207. return 2;
  208. }else if(isGB2312(buf2)){
  209. return 1;
  210. }else if(isBIG5(buf2)){
  211. return 4;
  212. }
  213. }
  214. return 1;
  215. }
  216. /***************功能函数群***************/
  217. //帮助信息
  218. void Help_Information(FILE* stream, int Exit_Code)
  219. {
  220. fprintf(stream,
  221. ">>>------------------------------------------------------------\n"
  222. "DISPLAYS THE CONTENTS OF A TEXT FILE\n"
  223. "VERSION 2.0\n"
  224. "tl  [file] [-n&num1,num2]|[-p&per1,per2]|[-i]|[-d&num]\n"
  225. "---------------------------------------------------------------\n\n"
  226. "    -h  Show help information\n"
  227. "    -n  Read lines from num1 to num2\n"
  228. "    -p  Read lines from percent1 to percent2\n"
  229. "    -i  Show file's information\n"
  230. "    -d  Detection latest num lines \n"
  231. "------------------------------------------------------------<<<\n"
  232. "                                                  10/19/2016\n"
  233. );
  234. exit(Exit_Code);
  235. }
  236. //按键函数
  237. int Getkey(int N,int T)
  238. {
  239. int i,KEY_V,start=clock();
  240. do{
  241. if(kbhit()){
  242. KEY_V=(int)(getch());
  243. if(KEY_V<97){KEY_V+=32;}
  244. return KEY_V;
  245. }
  246. for(i=0;i<=N;i++);
  247. }while((clock()-start)<T);
  248. return -1;
  249. }
  250. //行数统计
  251. int CountLines(FILE* fp)
  252. {
  253. int i=0;
  254. char* line=(char *)malloc(BUFF_SIZE*sizeof(char));
  255. while(!feof(fp)){
  256. fgets(line, BUFF_SIZE, fp);
  257. i++;
  258. }
  259. return i;
  260. }
  261. //文件信息
  262. void File_Information(FILE* fp, char* fname)
  263. {
  264. fseeko64(fp, (__int64)0, SEEK_END);
  265. __int64 fsize=ftello64(fp);
  266. fseeko64(fp, (__int64)0, SEEK_SET);
  267. int linenum=CountLines(fp);
  268. fprintf(stdout,
  269. "FILE NAME : %s\n"
  270. "FILE SIZE : %I64d\n"
  271. "FILE LINES: %d\n"
  272. ,fname, fsize, linenum
  273. );
  274. }
  275. //行显函数
  276. int DisplayLine(FILE* fp, int flag, int N1, int N2, __int64 F1, __int64 F2)
  277. {
  278. int i=0, n=0, BOM=0, EN=0;
  279. //设定BOM偏移值
  280. BOM=CheckBom(fp);
  281. if(BOM==1 || BOM==2 || BOM==4){
  282. EN=0;
  283. }else if(BOM==5 || BOM==6){
  284. EN=2;
  285. }else if(BOM==3){
  286. EN=3;
  287. }
  288. //设定模式偏移量
  289. if      (flag==0){
  290. fseeko64(fp, (__int64)EN, SEEK_SET);
  291. }else if(flag==1||flag==3){
  292. __int64 FD=(N1*BUFF_SIZE>F2)?F2:N1*BUFF_SIZE;
  293. fseeko64(fp, -FD, SEEK_END);
  294. N1=CountLines(fp)-N1+1;
  295. fseeko64(fp, -FD, SEEK_END);
  296. }else if(flag==2){
  297. fseeko64(fp,  F1, SEEK_SET);
  298. }
  299. if(BOM<5){
  300. char* Line=(char *)malloc(BUFF_SIZE*sizeof(char));
  301. while(!feof(fp)||flag==3){
  302. memset(Line, 0, BUFF_SIZE*sizeof(char));
  303. if(!fgets(Line, BUFF_SIZE, fp)){Sleep(1);}
  304. i++;
  305. if( ((N1<=i) && (i<=N2) && (F1<=ftello64(fp)) && (ftello64(fp)<=F2))||(flag==3) ){
  306. switch(BOM){
  307. case 1: //Ansi行显
  308. fputs(Line, stdout);
  309. break;
  310. case 2: //Utf8无BOM行显
  311. case 3: //Utf8行显
  312. fputs(UnicodeToANSI(UTF8ToUnicode(Line)), stdout);
  313. break;
  314. case 4: //Big5行显
  315. fputs(UnicodeToANSI(BIG5ToUnicode(Line)), stdout);
  316. break;
  317. }
  318. }else if((i>N2) && (ftello64(fp)>=F2)){
  319. break;
  320. }
  321. }
  322. }else if(BOM==5){               //Unicode行显
  323. wchar_t* LineW=(wchar_t *)calloc(BUFF_SIZE, sizeof(wchar_t));
  324. while(!feof(fp)||(flag==3)){
  325. memset(LineW, 0, BUFF_SIZE*sizeof(wchar_t));
  326. if(!fgetws(LineW, BUFF_SIZE, fp)){Sleep(1);}
  327. i++;
  328. if( ((N1<=i) && (i<=N2) && (F1<=ftello64(fp)) && (ftello64(fp)<=F2))||(flag==3) ){
  329. fputs(UnicodeToANSI(LineW), stdout);
  330. }else if((i>N2) && (ftello64(fp)>=F2)){
  331. break;
  332. }
  333. }
  334. }else if(BOM==6){               //Unicode big endian行显
  335. wchar_t* LineW=(wchar_t *)calloc(BUFF_SIZE, sizeof(wchar_t));
  336. while(!feof(fp)||(flag==3)){
  337. memset(LineW, 0, BUFF_SIZE*sizeof(wchar_t));
  338. if(!fgets(LineW, BUFF_SIZE, fp)){Sleep(1);}
  339. i++;
  340. if( ((N1<=i) && (i<=N2+1) && (F1<=ftello64(fp)) && (ftello64(fp)<=F2))||(flag==3) ){
  341. for(n=0;LineW[n]!=0x0000;n++){
  342. LineW[n]=(LineW[n]&0x00FF)<<8|(LineW[n]&0xFF00)>>8;
  343. }
  344. fputs(UnicodeToANSI(LineW), stdout);
  345. }else if((i>N2) && (ftello64(fp)>=F2)){
  346. break;
  347. }
  348. }
  349. }
  350. fflush(stdout);
  351. return 0;
  352. }
  353. /*************MAIN主函数入口*************/
  354. int main(int argc, char** argv)
  355. {
  356. int N1=1, N2=2147483631, FLAG=0, i;
  357. __int64 fsize=0;
  358. float P1=0.0, P2=1.0;
  359. FILE* fp;
  360. char* delims;
  361. if((argc==3) && (argv[2][0]=='-')){
  362. switch(argv[2][1]){
  363. case 'H':
  364. case 'h':
  365. Help_Information(stdout, 0);
  366. case 'N':
  367. case 'n':
  368. delims=(argv[2]+2);
  369. N1=atoi(strtok(delims, ","));
  370. N2=atoi(strtok(NULL, ","));
  371. if(N2==0){N2=2147483631;}
  372. if((N1>N2) || (N1<0) || (N2<0)){Help_Information(stderr, 1);}
  373. break;
  374. case 'P':
  375. case 'p':
  376. delims=(argv[2]+2);
  377. P1=atof(strtok(delims, ","));
  378. P2=atof(strtok(NULL, ","));
  379. if((P1>=P2) || (P1>1.0) || (P2>1.0) || (P1<0.0) || (P2<0.0) ){Help_Information(stderr, 1);}
  380. FLAG=2;
  381. break;
  382. case 'I':
  383. case 'i':
  384. if( (fp=fopen64(argv[1], "rb"))==NULL ){fputs("Read failed.", stdout);return 3;}
  385. File_Information(fp, argv[1]);
  386. fclose(fp);
  387. return 0;
  388. case 'D':
  389. case 'd':
  390. delims=(argv[2]+2);
  391. N1=abs(atoi(delims)), N1=(N1>FOLLOW_SIZE)?1000:N1, FLAG=1;
  392. if(argv[2][2]=='\0'){N1=FOLLOW_LINE,FLAG=3;}
  393. break;
  394. default:
  395. Help_Information(stderr, 2);
  396. }
  397. }else if(argc!=2){
  398. Help_Information(stderr, 3);
  399. }
  400. if( (fp=fopen64(argv[1], "rb"))==NULL ){
  401. fputs("Read failed.", stdout);
  402. return 3;
  403. }
  404. if(FLAG==1){
  405. do{
  406. fseeko64(fp, (__int64)0, SEEK_END);
  407. if( fsize!=ftello64(fp)){
  408. fsize =ftello64(fp);
  409. system("cls");
  410. DisplayLine(fp, 1, N1, 2147483631, 0, fsize);
  411. }
  412. }while(Getkey(64,FOLLOW_WAIT)!=113);
  413. fputs("\n", stdout);
  414. fclose(fp);
  415. return 0;
  416. }
  417. fseeko64(fp, (__int64)0, SEEK_END);
  418. fsize=ftello64(fp);
  419. DisplayLine(fp, FLAG, N1, N2, fsize*P1, fsize*P2);
  420. fclose(fp);
  421. return 0;
  422. }
复制代码
_____________
_____________
______________________________________________________________________________________________________________
同时发布tl的精简版minitl仅3KB大小,迷你版minitl只支持utf8和ansi编码,速度快,支持取负行,是more和type的替代品。

minitl的用法:
提取文本文件filename的第n行到第m行
  1. tl [filename] [n] [m]
复制代码
只提取第n行
  1. minitl [filename] [n]
复制代码
提取倒数第3行
  1. minitl [filename] -3
复制代码
提取第5行到文件结束
  1. minitl [filename] 5 -1
复制代码
base64加权压缩码。
  1. @echo off
  2. ::******Happy's 文本工具 minitl.exe******
  3. set "LINE=TVqQ[M]E]//8[Lg{AQ_{][Ag]A4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJ{ABQRQ[TAEC}AO[DwMLAQY}AYBU]Q]I]AB]Q]Ag[B{[E{[Aw]Ag[NQwB[M][B[AB][E[AE{B{][ACAg[A8$_{][BcI[AX_]C50ZXh0]UAc]Q]C]AI}[C[AGAuZGF0YQ[ACAC]I]AQ]K}[B[AD${[ABVieWB7Ag[ACQu]ABQu]ABQu]ABQu]ABQuP////9Qi0UIULg]AULg]AUOhzBg[iUX4i0X4QLkB]UVDoaAY[IPECIlF/Lg]AULg]AUItF+FCLRfxQuP////9Qi0UIULg]AULg]AUOgrBg[i0X86Q]DJw1WJ5YHsC]JC4]AFC4]AFC4/////1CLRQhQu]ABQuOn9[BQ6[G[CJRfyLRfxAuQI[ABRUOjlBQ[g8QIiUX4i0X8UItF+FC4/////1CLRQhQu]ABQuOn9[BQ6MQF[CLRfjp]AMnDVYnlgewI]kLg]AiUX8u]ABQi0UYUItFCFDonQU[IPEDItFCFDomQU[IPEBIXAD4QF]6dg[AC4AQ[AFC4AB[AFDoYAU[IPECIlF+ItFCFC4AB[AFCLRfhQ6GcF[CDxAyFwA+Eng[AItF/InBQIlF/ItFDIXAD4QF]6YU[ACLRfyLTRA5yA+Mdw[AItF/ItNFDnID44K]uP/////pjQ[AItFGIXAD4QF]6Rs[ACLBXggQACDwCBQi0X4UOgCBQ[g8QI6TQ[ACLRRiD+AMPhSg[ACLRfhQ6JT+//+DxARQ6Pz9//+DxASLDXggQACDwSBRUOjJB[Ag8QI6Q////+LRfhQ6MAE[CDxASLRQyFwA+EC]ItF/OkK]u]ADp]AMnDVYnlgewE]kLgB]ULgC]UOhTB[Ag8QIiUX8u]ABQu]ABQi0UIUOhIB[Ag8QMi0UIULgC]ULgB]UItF/FDoVAQ[IPEEItF/A+2CIH57w]+FIg[AItF/EAPtgiB+bs]PhQ8[AC4Aw[AOly]6WM[ACLRfwPtgiB+f8]PhSI[ACLRfxAD7YIgfn+]D4UP]uAI[ADpPg[AOkv]i0X8D7YIgfn+]D4Ud]i0X8QA+2CIH5/w]+FCg[ALgC]6Qo[AC4]AOk]AycNVieWB7Bg[ACQi0UMg8AEuQAgQABRiwhR6JgD[CDxAiJReiLReiD+[PhQ8[AC4Aw[AOnQAQ[6R8[ACLRehQ6MD+//+DxASJReyLRehQ6Gc.D[CDxARAiUX4i0UIg/gDD4Uf]i0UMg8AIiwhR6E4D[CDxASJRfSLRfSJRfDpWQ[AItFCIP4BA+FTQ[AItFDIPACIsIUegjAw[g8QEiUX0i0Xwg/j/u][PlMCFwA+EBQ[AOkW]i0UMg8AMiwhR6PQC[CDxATpBQ[ALj///8AiUXwi0X0i03wOcgPjiI[ACLRfCD+[PjhY[ACLRehQ6MkC[CDxAS4Ag[AOn4]i0X0g/gAD4wR]i0Xwg/gAD4wF]6ac[ACLRexQu]ABQu]ABQuAE[ABQi0XoUOh2/P//g8QUiUX8i0X0g/gAu][Pn8CFwA+EBQ[AOkO]i0X8QItN9AHI6QM[ACLRfSJRfSLRfCD+AC4][+fwIXAD4QF]6Q4[ACLRfxAi03wAcjpAw[AItF8IlF8ItF9ItN8DnID44W]i0XoUOgFAg[g8QEuAE[ADpN]ItF7FCLRfBQi0X0ULg]AUItF6FDo0/v//4PEFItF6FDo0QE[IPEBLg]A6Q]DJww}][AFWJ5YHsL]JCNRehQ6P4[ACDxAS4]AIlF1Lg[AMAULg[AEAUOiJAQ[g8QIuAE[ABQ6IMB[CDxASNRdRQu]ABQjUXcUI1F4FCNReRQ6G0B[CDxBSLRdxQi0XgUItF5FDoc/3//4PEDIlF2ItF2FDoUgE[IPEBMnD_][CHLCRVjWwkBFGJ6YHpAB[AIUBLQAQ[A9AB[AH3sKcGFAYngicyLCP9gBItF7MPo9////4sAiwDD6O3///9Q6Ov///9Q6O0[ACBxAg[ADDi2Xo6Nb///9Q6O]D/////OhZ[FIWQADp1w[AFWLbCQIjUQkDIlFADHAiUUEZKE]AiUUIuGwWQACJRQy4YBZ[IlFEDHAiUUUjUUIZKM]AXcM][P8lXCB]A/yVoIE]D/JWAgQ]P8lbCB]A/yVwIE]D/JXQgQ]P8lfCB]A/yWAIE]D/JYQgQ]P8liCB]A/yWMIE]D/JZAgQ]P8llCB]A/yWYIE]D/JZwgQ]P8loCB]A/yWkIE]D/JaggQ]P8lrCB]A/yWwIE#$_{][AHJi_{uC{][FCE[Fwg[DEI{]ABNIQ[aC}{][ISE[Dch{WCE[GEh[BpIQ[cCE[Hgh[B/IQ[hyE[I4h[CWIQ[niE[KYh[CtIQ[tiE[MMh[DUIQ[5CE[Osh[D5IQ[ASI{hIQ[NyE][ABYIQ[YSE[Gkh[BwIQ[eCE[H8h[CHIQ[jiE[JYh[CeIQ[piE[K0h[C2IQ[wyE[NQh[DkIQ[6yE[Pkh[ABIg][AGtlcm5lbDMyLmRsb]FdpZGVDaGFyVG9NdWx0aUJ5dGU[ABNdWx0aUJ5dGVUb1dpZGVDaGFyAG1zdmNydC5kbGw[ABjYWxsb2M[ABmc2Vlaw[AGZlb2Y[ABmZ2V0cw[AF9pb2I[ABmcHV0cw[AGZyZWU[ABmcmVhZ]GZvcGVu]ZnRlbGw[ABhdG9p]ZmNsb3Nl]X2NvbnRyb2xmc]F9fc2V0X2FwcF90eXBl]X19nZXRtYWluYXJncw[AGV4aXQ[ABfWGNwdEZpbHRlcg[AF9leGl0]X2V4Y2VwdF9oYW5kbGVyMw@#}A="
  4. ::******Base64加权解密器*************
  5. setlocal enabledelayedexpansion
  6. set "Z=A"&(for %%Z in ([,],{,},_,$,#,-,@) do (set "Z=!Z!!Z!"&for %%S in (!Z!) do (set "LINE=!LINE:%%Z=%%S!")))&echo !LINE:.=!>base64_minitl
  7. certutil -decode base64_minitl minitl.exe
复制代码
4

评分人数

本帖最后由 CrLf 于 2016-10-26 02:45 编辑

如果不考虑复杂度的话,该算法还可优化,例如:
AAAAAAAABBBBBBBBCDEBBBBBBBBCCCCAAAAAAAAAAAA

用顶楼算法得到的结果是:
#  BBBBBBBB  CDE  BBBBBBBB  CCCC  #-

进一步压缩得到的结果是(规则参考附文):
#  >B#  CDE  #  >C-  <#-
规则是在重复字符发生变化的节点前声明此后的重复字符,如多个重复字符串比邻,则仅需声明一次:
>B 此后的所有 @ - # $ _ } { ] [ 均表示特定个数的 B
>C 同上,表示特定个数的 C
<  同上,表示特定个数的 A(默认)
接下来可以再考虑如何处理重复的词

TOP

本帖最后由 523066680 于 2016-10-25 09:48 编辑

Perl和Python都是有直接的库可以检测,已经被脚本语言惯坏了,所以重看楼主C代码的时候觉得,良心制作。

不过,考虑到传入的文件名符号可能是Unicode的(比如拖放到终端),可以试试用 _tmain 或者 wmain
用了之后有些输入输出函数、参数要跟着加前缀

TOP

先赞一个吧
判定一个人是否为伸手党的标准是取决于他的态度和诚意。

TOP

回复 24# wskwfkbdn


神器1:http://www.bathome.net/s/tool/index.html?key=enca
神器2:http://www.bathome.net/s/tool/index.html?key=file

或 mshta:
  1. mshta http://bathome.net/s/hta/?string "t=iconv.load('a.html');list.charset().where(function(c){return iconv.toStr(t,c)})"|more
复制代码
http://www.bathome.net/viewthread.php?tid=39824

TOP

回复 23# 523066680

对,忽略bom头识别,
判定一个人是否为伸手党的标准是取决于他的态度和诚意。

TOP

本帖最后由 523066680 于 2016-10-24 22:24 编辑

回复 22# wskwfkbdn

所以…… 这个工具是你写的,在LE 和 BE这件事情上,识别效率和准确率比通过 00 0d , d0 00; 00 0a / 0a 00辨别更高??

TOP

本帖最后由 wskwfkbdn 于 2016-10-24 21:49 编辑

回复 21# 523066680

编码检测工具下载:图片另存为,改rar解压

判定一个人是否为伸手党的标准是取决于他的态度和诚意。

TOP

本帖最后由 523066680 于 2016-10-24 21:27 编辑

回复 20# wskwfkbdn

    ?我没有提供哪个方法,是觉得楼主以00 0d 或者 0d 00作为辨别是还可以的方案啊。
(就是说即使这个方法效率低,好吧,那不是我提出来的

然后从17楼看感觉可能频道不对,前面讨论 LE 和 BE 的辨别,为何涉及到GBK ?
前面gbk,utf8,测试识别还是准确的,识别unicode编码也就不难了,如果先进程编码转换 unicode转gbk编码,以gbk方法识别正确则认定是unicode编码


假设上面是在说LE 和 BE的辨别,我觉得,如果以转GBK再转unicode对比作为辨别,会有两个问题:
1. GBK的范围没有 UTF 这么广泛
2. 有些数据,既可以按大端序解读为Unicode再转GBK,也可以按小端序解读为Unicode再转GBK,他们看上去都是正常的字符或者汉字,这个时候怎么辨别LE 还是 BE?
  1. use Encode;
  2. binmode(STDOUT, ":encoding(gbk)");  #输出时统一转为gbk
  3. print  decode('gbk', "\xf9\x7a");
  4. print  decode('utf16-le', "\xf9\x7a");
  5. print  decode('utf16-be', "\xf9\x7a");
复制代码
输出
鵽竹梁

TOP

回复 19# 523066680

真的好吗?这方法我实验过,效率慢且不同编码有些字符集是相同的,会误判。
判定一个人是否为伸手党的标准是取决于他的态度和诚意。

TOP

本帖最后由 523066680 于 2016-10-24 20:16 编辑

再来一点,同样的字节值,可以按不同编码解读为不同的汉字/偏僻字
  1. gbk:
  2. 鵃鵄鵅鵆鵇鵈鵉鵊鵋鵌鵍鵎鵏鵑鵒鵓鵔鵕鵖鵗鵘鵙鵚鵛鵜鵝鵞鵟鵠鵡鵢鵣鵤鵥鵦鵧鵨鵩鵪鵫鵬鵭鵮鵯鵰鵱鵲鵳鵴鵵鵶鵷鵸鵹鵺鵻鵼鵽鵾鵿鶀鶁
  3. utf16-le:
  4. 䃹䇹䋹䏹䓹䗹䛹䟹䣹䧹䫹䯹䳹仹俹價凹勹叹哹嗹囹培壹姹嫹对峹巹廹忹惹懹拹揹擹旹曹柹棹槹櫹毹泹淹滹濹烹燹狹珹瓹痹盹矹磹秹竹篹糹緹绹
  5. utf16-be:
  6. 鹿論壟弄籠聾牢磊賂雷壘屢樓漏累縷陋勒肋凜凌稜綾菱陵讀拏樂諾丹寧怒率異北磻便復不泌數索參塞省葉說殺辰沈拾若掠略亮兩凉梁糧良諒量
  7. big5:
  8. 纘纛纙臠臡虆虇虈襹襺襼襻觿讙躥躤躣鑮鑭鑯鑱鑳靉顲饟鱨鱮鱭鸋鸍鸐鸏鸒鸑麡黵鼉齇齸齻齺齹圞灦籯蠼趲躦釃鑴鑸鑶鑵驠鱴鱳鱱鱵鸔鸓黶鼊
复制代码

TOP

utf16-be utf16-le
其中有一些把字节反过来可以成为另一种编码解读的对应字符,列出一些常见字符的部分
  1. 0034 - 4,  3400 - 㐀
  2. 0035 - 5,  3500 - 㔀
  3. 0036 - 6,  3600 - 㘀
  4. 0037 - 7,  3700 - 㜀
  5. 0038 - 8,  3800 - 㠀
  6. 0039 - 9,  3900 - 㤀
  7. 003A - :,  3A00 - 㨀
  8. 003B - ;,  3B00 - 㬀
  9. 003C - <,  3C00 - 㰀
  10. 003D - =,  3D00 - 㴀
  11. 003E - >,  3E00 - 㸀
  12. 003F - ?,  3F00 - 㼀
  13. 0040 - @,  4000 - 䀀
  14. 0041 - A,  4100 - 䄀
  15. 0042 - B,  4200 - 䈀
  16. 0043 - C,  4300 - 䌀
  17. 0044 - D,  4400 - 䐀
  18. 0045 - E,  4500 - 䔀
  19. 0046 - F,  4600 - 䘀
  20. 0047 - G,  4700 - 䜀
  21. 0048 - H,  4800 - 䠀
  22. 0049 - I,  4900 - 䤀
  23. 004A - J,  4A00 - 䨀
  24. 004B - K,  4B00 - 䬀
  25. 004C - L,  4C00 - 䰀
  26. 004D - M,  4D00 - 䴀
  27. 004E - N,  4E00 - 一
  28. 004F - O,  4F00 - 伀
  29. 0050 - P,  5000 - 倀
  30. 0051 - Q,  5100 - 儀
  31. 0052 - R,  5200 - 刀
  32. 0053 - S,  5300 - 匀
  33. 0054 - T,  5400 - 吀
  34. 0055 - U,  5500 - 唀
  35. 0056 - V,  5600 - 嘀
  36. 0057 - W,  5700 - 圀
  37. 0058 - X,  5800 - 堀
  38. 0059 - Y,  5900 - 夀
  39. 005A - Z,  5A00 - 娀
  40. 005B - [,  5B00 - 嬀
  41. 005C - \,  5C00 - 尀
  42. 005D - ],  5D00 - 崀
  43. 005E - ^,  5E00 - 帀
  44. 005F - _,  5F00 - 开
  45. 0060 - `,  6000 - 怀
  46. 0061 - a,  6100 - 愀
  47. 0062 - b,  6200 - 戀
  48. 0063 - c,  6300 - 挀
  49. 0064 - d,  6400 - 搀
  50. 0065 - e,  6500 - 攀
  51. 0066 - f,  6600 - 昀
  52. 0067 - g,  6700 - 最
  53. 0068 - h,  6800 - 栀
  54. 0069 - i,  6900 - 椀
  55. 006A - j,  6A00 - 樀
  56. 006B - k,  6B00 - 欀
  57. 006C - l,  6C00 - 氀
  58. 006D - m,  6D00 - 洀
  59. 006E - n,  6E00 - 渀
  60. 006F - o,  6F00 - 漀
  61. 0070 - p,  7000 - 瀀
  62. 0071 - q,  7100 - 焀
  63. 0072 - r,  7200 - 爀
  64. 0073 - s,  7300 - 猀
  65. 0074 - t,  7400 - 琀
  66. 0075 - u,  7500 - 甀
  67. 0076 - v,  7600 - 瘀
  68. 0077 - w,  7700 - 眀
  69. 0078 - x,  7800 - 砀
  70. 0079 - y,  7900 - 礀
  71. 007A - z,  7A00 - 稀
  72. 007B - {,  7B00 - 笀
  73. 007C - |,  7C00 - 簀
  74. 007D - },  7D00 - 紀
复制代码
[attach]10209[/attach] 附件

附件用sublime text打开,默认显示16进制码,可以手动用utf-16le格式查看,也可以用utf-16be格式查看,文字显示是反过来的

不过好在 000d 和 000a 就没有这个调换字节后相当于另一个常见字符的问题,而且本身比较常见,无BOM的情况下,我觉得以此为判断已经是比较好的办法。

TOP

回复 16# 523066680

前面gbk,utf8,测试识别还是准确的,识别unicode编码也就不难了,如果先进程编码转换 unicode转gbk编码,以gbk方法识别正确则认定是unicode编码
判定一个人是否为伸手党的标准是取决于他的态度和诚意。

TOP

回复 15# wskwfkbdn


    如果取样素材及其有限,我想一些主流文本编辑器也只能选择显示16进制码。用户得自己选择采用哪种编码浏览

TOP

回复 13# happy886rr

0D 00 0A 00
如果没有呢,就不好判断了吧
判定一个人是否为伸手党的标准是取决于他的态度和诚意。

TOP

返回列表