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

【擂台赛】将字符串转换为ascii值的高效代码 -- 批处理完成

[复制链接]
发表于 2012-3-6 18:51:35 | 显示全部楼层
本帖最后由 terse 于 2012-3-6 18:53 编辑

回复 45# CrLf
还是不以为这样的流程 是取文件的16进制
我以为还应用等大空文件 不是吗?(当然这里不讨论这个话题了)
发表于 2014-10-17 16:29:01 | 显示全部楼层
本帖最后由 neorobin 于 2014-10-17 17:29 编辑

回复 40# terse

有一个问题, 分号 : 不能处理

我做了以下测试  (WinXP 32bit 简体中文版 和 Win7 64bit 简体中文版)
  1. @echo off
  2. echo 1 & for /f "delims=" %%a in (";") do echo %%a
  3. echo 2 & for /f "delims=" %%a in (";.") do echo %%a
  4. echo 3 & for /f "delims=" %%a in (".;") do echo %%a
  5. echo 4 & for /f "delims=" %%a in (".;.") do echo %%a
  6. pause
复制代码
得到输出为
  1. 1
  2. 2
  3. 3
  4. .;
  5. 4
  6. .;.
复制代码
我认为是 for /f 把分号 ;  当成了默认的行注释符(以此字符在行首, 将略过一行)

微软官方文档 eol 字符的解释, 我不认同
eol=c    Specifies an end of line character (just one character).

http://technet.microsoft.com/en-us/library/bb490909.aspx

但是这里的描述与事实是相符的
for /F "eol=; tokens=2,3* delims=," %i in (myfile.txt) do @echo %i %j %k
This command parses each line in Myfile.txt, ignoring lines that begin with a semicolon and passing the second and third token from each line to the FOR body (tokens are delimited by commas or spaces).

我尝试用 0x20--0x7E 范围之外的字符来做这个默认的 eol 字符, 比如 0x08,  0x20--0x7E 范围内字符便都可正常获取了, 测试代码如下:
  1. @echo off & mode 80,300

  2. set "ASCII_20_7E=                                 !"#$%%^&'()*+,-./0123456789:;^<=^>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^^_`abcdefghijklmnopqrstuvwxyz{^|}~"
  3. set ASCII_20_7E

  4. setlocal enabledelayedexpansion

  5. set /a cnt=0x20
  6. for /l %%i in (0x20 1 0x7e) do (
  7.     for /f "eol=delims=" %%j in ("!ASCII_20_7E:~%%i,1!") do (
  8.         if "%%j"=="!" echo ASCII-33
  9.         if "%%j"=="^" echo ASCII-94
  10.         echo !cnt!  [%%j]
  11.         set /a cnt+=1
  12.     )
  13. )
  14. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
terse + 1 谢谢指正,&amp;quot;;&amp;quot; 应该存在

查看全部评分

发表于 2014-10-17 19:19:52 | 显示全部楼层
回复 47# neorobin
谢谢neorobin 指教了
对于 ";" 问题记得以前也讨论过处理   有时候用 FINDSTR /n 处理文件
当然设置 eol 也不失为一好的方法
唉 总是犯此类错
就此题的话 原方法不变的话 修改FOR为下面

  1.     for /f "tokens=1*" %%j in ("$ !str:~%%i,1!") do (
  2.         if "%%k" neq "" (
  3.            if "!#%%k!" neq "" (
  4.               if "!#%%k!" lss "%%k" (set Ans=!Ans! %%k-!$%%k!) else set Ans=!Ans! %%k-!$#%%k!
  5.            ) else if "!$%%k!" neq "" (set Ans=!Ans! %%k-!$%%k!)else set Ans=!Ans! %%k-61
  6.         ) else set Ans=!Ans! %%k-33
  7.     )
复制代码
发表于 2014-10-17 20:36:26 | 显示全部楼层
本帖最后由 CrLf 于 2014-10-17 20:37 编辑

回复 47# neorobin


"eol=delims=" 设置的是 eol=d,可以这样:
  1. for /F "tokens=2,3* delims=,"eol^= %%a in .....
复制代码
发表于 2014-10-17 21:08:26 | 显示全部楼层
本帖最后由 neorobin 于 2014-10-17 22:59 编辑

回复 49# CrLf

不是 d

= 和 d 之间有一个退格符, 在论坛上不可见, 但可以用 点击 论坛的 复制代码 正常拷贝

不用不可见字符, 下面这样也可以, 0x20--0x7E 内的字符都不会被看作 eol 字符
  1. for /f delims^=^ eol^= %%j in ("!var!") do ...
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 23:31 , Processed in 0.028545 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表