返回列表 发帖

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

以下代码是我找到的一个 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
复制代码
或者是调用第三方程序处理后再设置为变量的方法也可以.

找到一个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读取后再输出为批处理中的变量

TOP

本帖最后由 akari 于 2025-3-10 12:25 编辑

回复 4# aloha20200628


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

    看了一下fc.exe的参数说明,又搜索了一下,UNICODE字符集,是这个问题吧

TOP

总算是找到解决办法了. 调用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
复制代码

TOP

本帖最后由 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了.

TOP

回复 10# aloha20200628


    没办法最终还是改成这个了
  1. powershell -Command "[System.IO.File]::WriteAllBytes('$.1', [System.Text.Encoding]::UTF8.GetBytes('%str%'))"
复制代码

TOP

返回列表