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

[文本处理] 求助批处理字符串(UTF-8)转换成十六进制(HEX), 找到一个vbs可以转换

[复制链接]
发表于 2025-3-10 08:57:49 | 显示全部楼层 |阅读模式
以下代码是我找到的一个 ascii 到 hex 的批处理, 但无法处理中文字符串.
  1. set strLN=
  2. set str=string
  3. >str set /p=%str%<nul
  4. for /f "tokens=3,*" %%i in ('dir str ^| findstr 个文件') do (
  5.         set /a "nLen=%%i"
  6. )
  7. set "strCmp="
  8. for /l %%i in (1 1 %nLen%) do (
  9.         call set "strCmp=%%strCmp%%%%strLN%%"
  10. )
  11. >$ set /p=%strCmp%<nul
  12. set "strASC="
  13. for /f "skip=1 tokens=2 delims=: " %%i in ('fc /b str $') do (
  14.         call set "strASC=%%strASC%%%%i "
  15. )
  16. echo %strASC%
  17. pause
复制代码
或者是调用第三方程序处理后再设置为变量的方法也可以.
 楼主| 发表于 2025-3-10 10:43:13 | 显示全部楼层
找到一个vbs, 可以将中文转换成hex
  1. str="中文"
  2. Set ado=CreateObject("ADODB.Stream")
  3. Set xmldom=CreateObject("msxml2.domdocument")
  4. ado.Type=2
  5. ado.Charset="GB2312"
  6. ado.Open
  7. ado.WriteText str
  8. ado.Position=0
  9. ado.Type=1
  10. Set pic=xmldom.createElement("pic")
  11. pic.dataType="bin.hex"
  12. pic.nodeTypedValue=ado.Read(-1)
  13. WScript.Echo UCase(pic.text)
  14. ado.Close
复制代码
能不能用批处理设置一个变量让该vbs读取后再输出为批处理中的变量
发表于 2025-3-10 11:08:15 | 显示全部楼层
本帖最后由 523066680 于 2025-3-10 11:18 编辑

倒是写过一个剪切板工具,把剪切板里的字符(或者调用时传参),默认按gbk解读(脚本里也可以改其他编码),然后"翻译"成各种编码的16进制后打印出来
decode.pl
  1. C:\Users\Default>decode.pl 中文
  2. d6 d0 ce c4     gbk

  3. a4 a4 a4 e5     big5

  4. e4 b8 ad e6 96 87       utf8

  5. 2d 4e 87 65     utf16-le

  6. 4e 2d 65 87     utf16-be

  7. 20013 25991     Unicode
  8. 4E2D 6587       Unicode
  9. \xE4\xB8\xAD\xE6\x96\x87        utf8
复制代码
Perl这个东西太冷门了,所以……  当我没说。

评分

参与人数 1技术 +1 收起 理由
zzz19760225 + 1 如果象sed.exe那样的独立perl.exe,会不会好 ...

查看全部评分

发表于 2025-3-10 11:46:35 | 显示全部楼层
回复 1# akari

fc.exe 加持参数 /u,用以下代码试试...

  1. @echo off &setlocal &set "sc=中文字符串"
  2. set/p="%sc%"<nul>$.0&for %%l in ($.0) do (fsutil file createnew "$.1" %%~zl)>nul 2>nul
  3. for /f "skip=1 tokens=2 delims=: " %%a in ('fc /b /u $.0 $.1') do (call set "sx=%%sx%%%%a ")
  4. del/q "$.?" &echo,%sx%
  5. pause&exit/b
复制代码
 楼主| 发表于 2025-3-10 12:11:50 | 显示全部楼层
本帖最后由 akari 于 2025-3-10 12:25 编辑

回复 4# aloha20200628


    感谢你的帮助, 但我还有一些疑惑.
    中文字符串 转换成16进制完整的应该是 D6 D0 CE C4 D7 D6 B7 FB B4 AE
    但是你这个批处理为什么只显示了绿色的部分?

    看了一下fc.exe的参数说明,又搜索了一下,UNICODE字符集,是这个问题吧
 楼主| 发表于 2025-3-10 12:54:42 | 显示全部楼层
总算是找到解决办法了. 调用powershell可以实现, 以下是
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "text=中文"

  4. for /f "delims=" %%a in (
  5.     'powershell -ExecutionPolicy Bypass -Command "$bytes=[System.Text.Encoding]::UTF8.GetBytes('%text%'); $hexStr=[System.BitConverter]::ToString($bytes); $hexStr.Replace('-', ' ')"'
  6. ) do (
  7.     set "hex=%%a"
  8. )

  9. echo HEX: !hex!
  10. endlocal
  11. pause
复制代码
发表于 2025-3-10 13:42:59 | 显示全部楼层
下载coder.exe
  1. coder -r 16 ec -s 中文
复制代码
  1. coder -c ansi utf-8 -s 中文|coder -r 16 ec -s
复制代码
发表于 2025-3-10 13:54:54 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-3-10 13:55 编辑

回复 5# akari

若4楼代码被存为 utf-8 编码文件运行,须用以下代码

  1. @echo off &chcp 65001>nul
  2. setlocal &set "sc=中文字符串"
  3. set/p="%sc%"<nul>$.1&for %%l in ($.1) do (fsutil file createnew "$.0" %%~zl)>nul 2>nul
  4. for /f "skip=1 tokens=2 delims=: " %%a in ('fc /b /u $.1 $.0') do (call set "sx=%%sx%%%%a ")
  5. del/q "$.?" &echo,%sx%
  6. pause&exit/b
复制代码
如果以上代码被存为 gb2312 编码(即记事本的ANSI编码)文件运行,则须修改其中第一行的 65001 为 936 即可...

评分

参与人数 1技术 +1 收起 理由
akari + 1 这个可以, 稍加改动我就可以使用了,非常感谢 ...

查看全部评分

 楼主| 发表于 2025-3-10 16:19:47 | 显示全部楼层
本帖最后由 akari 于 2025-3-10 16:44 编辑

回复 8# aloha20200628


    转换出来依旧不是 UTF-8 HEX, "中文" 转换 UTF-8 HEX 为 E4 B8 AD E6 96 87, 而不是 D6 D0 CE C4.
    能改改转换成UTF-8 HEX 么?
  1. @echo off
  2. chcp 65001 >nul
  3. setlocal enabledelayedexpansion
  4. set "str=中文"
  5. call :text2hex
  6. exit /b

  7. :text2hex
  8. rem 将 str 的值赋给 sc
  9. set "sc=!str!"
  10. rem 使用 `set /p` 避免换行符
  11. <nul set /p=!sc! >$.1
  12. rem 计算文件大小
  13. for %%l in ($.1) do fsutil file createnew "$.0" %%~zl >nul 2>nul
  14. set "sx="
  15. rem 以二进制方式读取并转换为 HEX
  16. for /f "skip=1 tokens=2 delims=: " %%a in ('fc /b $.1 $.0') do (
  17.     call set "sx=%%sx%% %%a"
  18. )
  19. del /q "$.?" >nul 2>nul
  20. echo HEX: %sx%
  21. pause
复制代码
改成这样ok了.
发表于 2025-3-10 16:47:26 | 显示全部楼层
回复 9# akari

中文数据的utf-8编码与其ANSI编码是不同的,与之对应的16进制码数自然也是不同的...
8楼代码中的sc变量替换为 中文,用65001版获取的16进制码数应为 E4 B8 AD E6 96 87,而用936版获取的应为 D6 D0 CE C4。
 楼主| 发表于 2025-3-10 17:01:54 | 显示全部楼层
回复 10# aloha20200628


    没办法最终还是改成这个了
  1. powershell -Command "[System.IO.File]::WriteAllBytes('$.1', [System.Text.Encoding]::UTF8.GetBytes('%str%'))"
复制代码
发表于 2025-3-10 18:16:52 | 显示全部楼层
ansi环境下 ,中文二字直接换成bat变量就行

node.js
https://nodejs.org/download/release/v4.9.1/win-x86/
下exe ,添加到环境变量即可

  1. node -e "console.log(new Buffer('中文'))"
复制代码
python
https://www.python.org/downloads/windows/
版本3.5以上 ,下embeddable版 ,解压后添加环境变量即可

  1. python -c "print('中文'.encode().hex())"
复制代码
ruby
https://rubyinstaller.org/downloads/
下zip版 ,解压后添加环境变量即可

  1. ruby -e "puts '中文'.encode('utf-8').unpack('H*')"
复制代码
bat ,编码保存为ansi ,输出干扰较多

  1. @echo off&chcp 936>nul

  2. set "str=中文"

  3. chcp 65001>nul
  4. setlocal enabledelayedexpansion
  5. echo,!str! >"!TEMP!\$$"
  6. endlocal&chcp 936>nul
  7. certutil -dump "%TEMP%\$$"
  8. pause&exit/b
复制代码
发表于 2025-3-10 18:32:59 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-3-10 18:47 编辑

回复 11# akari

用以下这个版本就可以了,代码存为 ANSI(gb2312)编码运行,最后获取的变量 sx 值就是 E4 B8 AD E6 96 87 ...

  1. @echo off &chcp 936>nul
  2. del/q "$.?" 2>nul &setlocal &set "sc=中文" &chcp 65001>nul
  3. set/p="%sc%"<nul>$.1&for %%l in ($.1) do (fsutil file createnew "$.0" %%~zl)>nul 2>nul
  4. for /f "skip=1 tokens=2 delims=: " %%a in ('fc /b /u $.1 $.0') do (call set "sx=%%sx%%%%a ")
  5. chcp 936>nul &del/q "$.?" &echo,%sx%
  6. pause&exit/b
复制代码
发表于 2025-3-10 20:26:08 | 显示全部楼层
给楼主发个C ,编译后直接带上参数运行就行了 ,速度飞快

  1. #include <stdio.h>
  2. #include <windows.h>

  3. #pragma comment(lib, "shell32")

  4. int main(){
  5. int argc;
  6. void **argv;
  7. unsigned char c[8192]={0};
  8. int n=0;
  9. argv=(void **)CommandLineToArgvW(GetCommandLineW(), &argc);
  10. if(argc>1){
  11. for(int i=1;i<argc;i++){
  12. WideCharToMultiByte(CP_UTF8,0,argv[i],-1,c,sizeof(c),NULL,NULL);
  13. for(unsigned int j=0;*(c+j);j++)printf("%02X ",*(c+j));
  14. printf("\b\n");
  15. }}
  16. LocalFree(argv);
  17. return 0;
  18. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 11:28 , Processed in 0.021825 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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