Board logo

标题: [文本处理] [分享]批处理实现十六进制码与十进制码互转 [打印本页]

作者: ZJHJ    时间: 2010-8-10 22:10     标题: [分享]批处理实现十六进制码与十进制码互转

级别不够,只能发在这里了。

  1. @echo off
  2. :: wangwei qq 251485609
  3. (chcp 437 &graftabl 936)>nul
  4. SET SYB=A100;0AEB 3030 3020 2030 3030 2420 00B8 CD00;B833 0001 33CD 05B8 CD00 A933 0007 F674;E086 300D A330 0102 C889 08B3 18E8 A300;0105 D089 08B3 0EE8 A300 0108 09B4 02BA;CD01 B421 CD4C F621 08F3 74E4 FE02 FEC0;88C0 B1C4 D204 25E8 0F0F 300D 3C30 7639;0402 8007 39FC 0376 C480 C307  ;
  5. SET V=;RCX;006C;N mouse.com;W;Q
  6. (ECHO.%SYB:;=&ECHO.DW %&ECHO.%V:;=&ECHO.%)|DEBUG>NUL
  7. :fhzb
  8. cls
  9. @echo.
  10. @echo                 十六进制码与十进制码互转
  11. @echo.
  12. @echo   十六进制转十进制码
  13. @echo.
  14. @echo   十进制转十六进制码
  15. for /f "tokens=1-3" %%1 in ('mouse.com') do (set /a X=0x%%2,Y=0x%%3)  2>nul
  16. if %X% GTR 3 if %X% LSS 20  if %Y% EQU 4 goto slzs
  17. if %X% GTR 3 if %X% LSS 20  if %Y% EQU 6 goto szsl
  18. goto :fhzb
  19. :slzs
  20. cls
  21. @echo.
  22. @echo   十六进制转十进制码
  23. @echo.
  24. set/p file=输入要处理的十六进制文件:
  25. ::按空格分开为行
  26. cd.>temp.txt
  27. for /f  "delims=" %%i in (%file%) do (
  28.   for %%a in (%%i) do echo %%a>>temp.txt
  29. )
  30. cd.>十进制.txt
  31. setlocal EnableDelayedExpansion
  32. for /f  %%a in (temp.txt) do (
  33.         set s=%%a
  34.         set /a s=0x!s!
  35.         set /p=!s! <nul >>十进制.txt
  36. )
  37. del temp.txt
  38. goto:eof
  39. :szsl
  40. @echo off
  41. cls
  42. @echo.
  43. @echo   十进制转十六进制码(仅适合于十六进制转换的十进制码)
  44. @echo.
  45. set/p file=输入要处理的十进制文件:
  46. ::按空格分开为行
  47. setlocal EnableDelayedExpansion
  48. cd.>temp.txt
  49. for /f  "delims=" %%i in (%file%) do (
  50.   for %%a in (%%i) do echo %%a>>temp.txt
  51. )
  52. cd.>十六进制.txt
  53. for /f  %%a in (temp.txt) do (
  54. set  qwe=%%a
  55. set  qwe=!qwe!
  56. call :duon %qwe%
  57. set /p=!cdm! <nul >>十六进制.txt
  58. )
  59. del temp.txt
  60. goto:eof
  61. :duon
  62. set /a y= qwe%%16
  63. set /a ya=qwe/16%%16
  64. set  m=0123456789ABCDEF
  65. set  cdm=!m:~%ya%,1!!m:~%y%,1!
  66. goto:eof
复制代码


----------
如果你要任意十进制转十六进制,可以将长度计算修改即可。有效处理为2147483647
即:
:duon
set /a y= qwe%%16
set /a ya=qwe/16%%16
set /a yb=qwe/256%%16
set /a yc=qwe/4096%%16
set /a yd=qwe/65536%%16
set /a ye=qwe/1048576%%16
set /a yf=qwe/16777216%%16
set /a yg=qwe/268435456%%16
set  m=0123456789ABCDEF
set  cdm=!m:~%yg%,1!!m:~%yf%,1!!m:~%ye%,1!!m:~%yd%,1!!m:~%yc%,1!!m:~%yb%,1!!m:~%ya%,1!!m:~%y%,1!

[ 本帖最后由 ZJHJ 于 2010-8-10 22:33 编辑 ]
作者: FOR    时间: 2010-8-10 22:26

http://www.bathome.net/thread-404-1-1.html
作者: hfg1977    时间: 2010-8-11 00:28

没必要搞这么复杂吧?
这些代码前人写过 n遍了.....
原理
5. 十 ----> 十六
  (25.625)(十)
  整数部分:
  25/16=1......9
  1/16 =0......1
  然后我们将余数按从下往上的顺序书写就是:19,那么这个19就是十进制25的十六进制形式
  小数部分:
  0.625*16=10(即十六进制的A或a)
  然后我们将整数部分按从上往下的顺序书写就是:A,那么这个A就是十进制0.625的十六进制形式
  所以:(25.625)(十)=(19.A)(十六)

我自己写的封装模块:,=2147483647
  1. :::=======================10进制转16进制==============================
  2. ::返回值在中%sum%
  3. :dec2hex
  4. if not "%frist_BL%"=="1" (set "frist_BL=1"&set "sum="&set "yu_num="&set /a sor_num=%*)
  5. set /a yu_num= %sor_num% %% 16
  6. set /a sor_num /= 16
  7. call:set_YU %yu_num%
  8. set sum=%ret%%sum%
  9. if %sor_num% lss 16 (set "end_BL=1"&call:set_YU %sor_num%) else (set "end_BL=0")
  10. if "%end_BL%"=="1" (set sum=%ret%%sum%&set "frist_BL=0"&goto:eof)
  11. goto dec2hex
  12. :set_YU
  13. set ret=
  14. if "%1" == "10" set ret=A
  15. if "%1" == "11" set ret=B
  16. if "%1" == "12" set ret=C
  17. if "%1" == "13" set ret=D
  18. if "%1" == "14" set ret=E
  19. if "%1" == "15" set ret=F
  20. if %1 lss 10 set ret=%1
  21. goto :eof
  22. ::=======================END CODE===============================
复制代码
16转10  对于P来说不存在呀
set/a decNumber=0xhNumber
就ok了
作者: hfg1977    时间: 2010-8-11 00:44

re: mouse.com 楼主能否说明一下, 调用鼠标功能中断INT 33H 干什么呀?
.bat运行后 ntvdm.exe 占用100% 程序无反应.

[ 本帖最后由 hfg1977 于 2010-8-11 00:57 编辑 ]
作者: terse    时间: 2010-8-11 03:34

可以处理大点的数
  1. @echo off&setlocal enabledelayedexpansion
  2. set/p s=输入转换数:
  3. set/p x=请输入要转换的几进制?
  4. set str=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
  5. :lp
  6. set /a "n=8189,m=0,r=0"
  7. for /l %%a in (1,1,14) do (
  8.      set /a "u=(n+m)/2"
  9.      for %%i in (!u!) do if "!s:~%%i!" equ "" (set /a n=u) else set /a m=u
  10. )
  11. for /l %%i in (0,1,%u%) do (
  12.    rem set/a "n=!s:~%%i,1!+(r*10),r=n&1,n>>=1"
  13.    set/a "n=!s:~%%i,1!+(r*10),r=n%%x,n/=x"
  14.    set v=!v!!n!
  15. )
  16.    set b=!str:~%r%,1!!b!
  17.    if "!v:0=!" neq "" set s=!v!&set "v="&goto lp
  18.    echo "!b!"
  19. pause
复制代码

作者: hfg1977    时间: 2010-8-11 04:49

看到楼上用字符串截取,我也跟着改进下
省了不少代码呀 哈哈 感谢了
  1. ::==================10进制转16进制==============================
  2. ::返回值在中%ret%
  3. :dec2hex
  4. set str=0123456789ABCDEF&set "ret="
  5. set/a d=%~1
  6. :lp
  7. set/a y=!d!%%16,d/=16
  8. call set ret=%%str:~!y!,1%%!ret!
  9. if !d! NEQ 0 goto:lp
  10. goto :eof
  11. ::=======================END CODE===============================
复制代码

作者: qzwqzw    时间: 2016-3-29 09:36

本帖最后由 qzwqzw 于 2016-3-29 09:43 编辑

也顺便分享一下自己用过的两段代码吧
算法都差不太多,只不过稍微精简了些代码
  1. @echo off & setlocal EnableDelayedExpansion
  2. set #i=22345
  3. set $t=0123456789ABCDEF
  4. set /a "#1=#i>>12,#2=(#i&0xF00)>>8,#3=(#i&0xF0)>>4,#4=#i&0xF"
  5. set #o=!$t:~%#1%,1!!$t:~%#2%,1!!$t:~%#3%,1!!$t:~%#4%,1!
  6. echo %#i%=0x%#o%
  7. pause
复制代码
  1. :dec2hex - %1 十进制数值 %2 十六进制变量名
  2. setlocal EnableDelayedExpansion
  3. set #i=%1
  4. set $t=0123456789ABCDEF
  5. for /l %%i in (1,1,8) do set/a"#%%i=#i&15,#i>>=4"&for %%e in (!#%%i!) do set #o=!$t:~%%e,1!!#o!
  6. endlocal & set %2=%#o%
复制代码

作者: CrLf    时间: 2016-3-29 10:00

回复 7# qzwqzw


    您这潜水艇是核动力的哈哈,一潜就是好几年
作者: CrLf    时间: 2016-3-29 10:05

hta:
  1. @echo off
  2. for /f %%a in ('"mshta http://bathome.net/s/hta/ 123456 .toString(16)"') do echo 0x%%a
复制代码

作者: qzwqzw    时间: 2016-3-29 10:43

回复 8# CrLf

是好久没来了

话说9楼用到的在线HTA脚本似乎有一段时间了
有点“云计算”的意思
不知道是谁的大作啊?
作者: codegay    时间: 2016-3-29 10:50

回复 10# qzwqzw


    就他.
作者: qzwqzw    时间: 2016-3-29 11:23

嗯,刚才翻了翻HTA库的源码
顺便也了解了一下该项目的源流
bat、vbs、js 原生混编
http://www.bathome.net/thread-34109-1-1.html
批处理之家 js 在线脚本库
http://www.bathome.net/thread-34544-1-1.html
确实奇思妙想浩帙鸿篇
几位主创均非一般
尤其CrLF更是非凡
作者: qzwqzw    时间: 2016-3-29 11:31

本帖最后由 qzwqzw 于 2016-3-29 11:33 编辑

最后还是回归楼主十进制转换的正题吧
刚才简单调整了一下自己的第二段代码
查表替换的思路也是拾人牙慧
个人代码还是以实用为主效率为辅
  1. :dec2hex - %1 十进制数值 %2 十六进制变量名
  2. setlocal EnableDelayedExpansion
  3. set n=%1
  4. for /l %%i in (1,1,8) do set/a"H%%i=n&15,n>>=4"&set o=!H%%i!:!o!
  5. for %%e in ("10:=A" "11:=B" "12:=C" "13:=D" "14:=E" "15:=F" ":=") do set o=!o:%%~e!
  6. endlocal & set %2=%o%
复制代码

作者: CrLf    时间: 2016-3-29 12:44

回复 12# qzwqzw


这评价好高,受精若宠受宠若惊...

其实原帖是这个:http://www.bathome.net/thread-38393-1-1.html
第三方工具的资源来自 Batch-CN 项目:http://www.bathome.net/viewthread.php?tid=32322

当然,最初的起源还是 est 的 mshta vbscript: 用法




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2