Board logo

标题: [文本处理] 批处理如何将txt文本里列出的多行16进制数转换成10进制数 [打印本页]

作者: am873    时间: 2013-11-20 10:15     标题: 批处理如何将txt文本里列出的多行16进制数转换成10进制数

本帖最后由 pcl_test 于 2017-4-30 16:25 编辑

批处理如何把“大数进制转换代码”改为“大数文本转换?

源代码:http://www.bathome.net/viewthread.php?tid=17141&rpid=109904&ordertype=0&page=1#pid109904

想把  set 大数=111111111111111111111111111111
改为:从一个大数16进制文本a.txt读取,转换后把结果输出为16_10.txt

我的修改:
for /f "delims=" %%a in (a.txt) do (
set from=16
set to=10
call :XConvert %%a %from% %to% 结果
echo %%a---------------》%结果%) >>16_10.txt
pause
goto :eof

执行修改后的代码结果如下:
……
以零为除数的错误。
以零为除数的错误。
命令语法不正确。
请按任意键继续. . .


请教该如何修改?谢谢!!!

当a.txt的编码为ANSI时,执行BAT后是上面的结果,如果编码改为UTF-8则是一个空窗口

a.txt的内容如下
075583266236
EDA4CCF0
059236564291
32FF3A92
FEEBA9879CC6
C26A3A92
EC7D731CF816
D2319D03
A9ECF819CDDA
32D9A703
E17163AD8E50
64B5855B
6456DE80C62D
A08E80C6
C4A0BA12543C
54C9C3DB
6655309BF8AB
A4E1C2DB
44AEC69B2AB0
662BC439
EF38B3792445
107A81C6
C33D2AD6EAF0
F431865B
30D454645987
F4B4825B
55EBA33F69CF
F02D7FC6
E19D94F7598A
作者: foxJL    时间: 2013-11-20 10:20

你想把文本里的16进制换成10进制?
批处理不支持UTF-8编码。
作者: am873    时间: 2013-11-20 10:27

是的 想把文本里的16进制换成10进制。
该如何修改?谢谢。
作者: foxJL    时间: 2013-11-20 10:34

本帖最后由 foxJL 于 2013-11-20 10:35 编辑

qzwqzw的源代码,我只作小改动,
原贴地址:http://www.bathome.net/viewthrea ... mp;page=1#pid109904
  1. @echo off & setlocal EnableDelayedExpansion
  2. for /f %%i in (a.txt) do (
  3. set 大数=%%i
  4. set from=16
  5. set to=10
  6. call :XConvert !大数! !from! !to! 结果
  7. echo [!from!进制] !大数!
  8. echo [!to!进制] !结果!
  9. )
  10. pause
  11. goto :eof
  12. :XConvert - X进制大数N转换为指定Y进制(X/Y不大于62)
  13. :: 参考链接:http://www.cppblog.com/baby-fly/archive/2009/10/24/99362.html
  14. ::           http://www.cnblogs.com/phinecos/archive/2009/09/11/1564975.html
  15. setlocal EnableDelayedExpansion
  16. set 源数=%~1
  17. set 源进制=%~2
  18. set 目标进制=%~3
  19. set 返回值=%~4
  20. set 进制数列=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
  21.         :XCloop1
  22.         set 位号=0
  23.         set 模=0
  24.         set 商=
  25.                 :XCloop2
  26.                 set 当前位=!源数:~%位号%,1!
  27.                 set 当前位值=-1
  28.                         :XCLoop3
  29.                         set /a 当前位值+=1
  30.                         if not "%当前位%"=="!进制数列:~%当前位值%,1!" goto :XCLoop3
  31.                 set /a 当前除数=模 * 源进制 + 当前位值
  32.                 set /a 当前商=当前除数 / 目标进制
  33.                 set 商=%商%!进制数列:~%当前商%,1!
  34.                 if "%商%"=="0" set 商=
  35.                 set /a 模=当前除数 %% 目标进制
  36.                 set /a 位号+=1
  37.                 if not "!源数:~%位号%,1!"=="" goto :XCloop2
  38.         if "%商%"=="" set 商=0
  39.         set 目标数=!进制数列:~%模%,1!%目标数%
  40.         set 源数=%商%
  41.         if not "%源数%"=="0" goto :XCloop1
  42. endlocal & set %返回值%=%目标数%
  43. goto :eof
复制代码

作者: am873    时间: 2013-11-20 10:42

可以了,谢谢foxJL老大。这个问题折腾3天了,终于解决。
太感谢了!!!!!
作者: 1270697389    时间: 2013-11-20 12:32

qzwqzw的源代码,我只作小改动,
原贴地址:
foxJL 发表于 2013-11-20 10:34



    太厉害了!我得好好学习
作者: PowerShell    时间: 2013-11-20 12:42

本帖最后由 PowerShell 于 2013-11-20 12:46 编辑

如何把“大数进制转换代码”改为“大数文本转换  -----这标题真不通顺

powershell代码
  1. [system.reflection.assembly]::loadwithpartialname("System.Text") | Out-Null
  2. [int32]$long = 1024 * 1024 * 128 #128MB
  3. $大字符串 = New-Object System.Text.StringBuilder($long)
  4. foreach   (  $每个文件  in (Get-ChildItem    -path 'e:\pscode\坛友am873\*.txt') )
  5. {
  6. foreach ($文件中的每一行   in  (Get-Content -LiteralPath  $每个文件)  )
  7. {
  8. $文件中的每一行2 = ('0x' + $文件中的每一行) -as  [int64]
  9. $大字符串.AppendLine($文件中的每一行2) | Out-Null
  10. }
  11. Add-Content  -value $大字符串   -Encoding unicode   -LiteralPath  $($每个文件.fullName  + '.txt')
  12.     #生成  文件名.txt.txt
  13.     $大字符串.clear()
  14. }
复制代码

作者: hzcxdgioa    时间: 2013-11-28 22:06

支持楼主的帖子。!!!!!!!!!!!




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