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

[文本处理] [原创]批处理函数求字符串字节数

求字符串的字节数,欢迎大家测试

论坛不支持asiic码为09(制表符)和某些控制字符,比如0a,0b,0c,0d,。。。。等字符,为方便大家复制代码测试对这些控制字符暂不考虑,
  1. :: 该函数需要在启用变量延迟后定义
  2. :: 测试字符串若含有引号,要转义处理,用“""”替换“"”即可;
  3. :: 算法:一个字符串的字节数 = 字符串的字符个数 + 包含的双字节字符的个数
  4. :: 预处理一次耗时相当于25~26个“set var=value”命令的耗时;
  5. :: define ##=_sizeof(#1)
  6. set "_sizeof=if ^!#1^!.==. (set ##=0)else set 1=^!#1:""=#^!&set L=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff&for /f "delims=1234567890abcdefghijklmnopqrstuvwxyz~^^!@#$%%^^^^^&*(),./^<^>?\^|;'\:{}[] tokens=1-31" %%? in (" ^^!1: =^^!")do set "a=^^!L^^!%%?%%@%%A%%B%%C%%D%%E%%G%%H%%I%%J%%K%%L%%M%%N%%O%%P%%Q%%R%%S%%T%%U%%V%%W%%X%%Y%%Z%%[%%\%%]%%?%%@%%A%%B%%C%%D%%E%%G%%H%%I%%J%%K%%L%%M%%N%%O%%P%%Q%%R%%S%%T%%U%%V%%W%%X%%Y%%Z%%[%%\%%]"&set b=^!L^!^!1^!^!1^!&set/aa=0x^!a:~-512,2^!,b=0x^!b:~-512,2^!,a+=b-1&set ##=^!a^!"
复制代码

[ 本帖最后由 plp626 于 2011-2-28 11:05 编辑 ]

10亿个字符,是批处理的数值范围,实际上用不了那么多,批处理好像也有字符上限,具体多少忘记了。

TOP

回复 12楼 的帖子

就代码而言支持的长度 未必在这里FOR里能实现吧?

TOP

另外去掉 if "%str%"=="" goto :lp 这一句,也支持“特殊字符”。
9楼的样品可以测试。
之所以加上 if "%str%"=="" goto :lp ,是因为如果输入的字符为空,会得到1073741824的值。

TOP

下面这个代码,支持不超过1073741824个字符的字符串。
  1. @echo off&setlocal enabledelayedexpansion
  2. set /a num=536870912
  3. :lp
  4. set /p str=
  5. if "%str%"=="" goto :lp
  6. for %%i in (268435456 134217728 67108864 33554432 16777216 8388608 4194304 2097152 1048576 524288 262144 131072 65536 32768 16384 8192 4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
  7.     for %%j in (!num!) do (
  8.         if "!str:~%%j,1!"=="" (
  9.             set /a num=num-%%i
  10.         ) else (
  11.             set /a num=num+%%i
  12.         )
  13.     )
  14. )
  15. if not "!str:~%num%,1!"=="" (
  16.     set /a num=num+1
  17. )
  18. echo %num%
复制代码

[ 本帖最后由 caruko 于 2011-3-3 01:47 编辑 ]
1

评分人数

TOP

9楼的貌似是计算字符串个数吧,不是计算字节啊
字符串的计算,我记得有一个折半法,可以很快的计算出字符串个数。
2的32次方,6W多个字符也只需要32次循环就得出结果了。

TOP

回复 9楼 的帖子

原来在这个代码中(开启变量延迟的情况下)兼容感叹号的方法就是用!str!引用变量,而不是%str%,果然很有用啊。这个补充字符算法思路也很好啊~又受教了。
看得多说得多,远比不上写得多。

TOP

我来改进下补充字符算法(兼容特殊字符):
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (10000,1,11000) do (
  3.     set "str=%%a"&set "code=!str:~1!!code!"
  4. )
  5. :lp
  6. cls&set "str="&set /p str=enter code:
  7. set "var=!str!!str!!str!!str!"
  8. set "var=!var!!code!"&set "var=!var:~4000,4!"
  9. set /a var=1%var%%%10000
  10. echo !str!有%var%个字符
  11. pause&goto lp
复制代码
附:一个测试结果
enter code:<>>?/"|\~!@#$"%^&*(")(:;'
<>>?/"|\~!@#$"%^&*(")(:;'有25个字符
请按任意键继续. . .

[ 本帖最后由 batman 于 2011-2-28 10:40 编辑 ]
***共同提高***

TOP

=.= 没看懂
一个简单的办法就是,先创建一个已知字节的文本文件,然后将字符串附加进去,dir一下得出字节减去初始字节。

TOP

我把算法思想写了,至于实现各人有各人的代码,也许有更精简的,我很想看看;

这个代码实现的目的只为速度快,考虑的字符更全面;

TOP

这倒也是
楼主的代码真复杂,我真的看晕了...

TOP

关于库,还是
全局变量以0X7F0X08开始
临时变量以0X7F开始
比较好,方便调试。

TOP

一个想法:
全局变量以0X7F0X08开始,临时变量以0X08开始

TOP

呵呵,
传统的那两种方法,和这第三种方法赛赛速度:

TOP

可以输出到文件或者findstr /o吗?

TOP

返回列表