标题: [文件操作] (已解决)如何用bat删除文件的16进制前四个字节 [打印本页]
作者: cbbos 时间: 2023-4-23 19:23 标题: (已解决)如何用bat删除文件的16进制前四个字节
本帖最后由 cbbos 于 2023-4-27 12:48 编辑
[img][/img]
如图
作者: cbbos 时间: 2023-4-23 19:24
本帖最后由 cbbos 于 2023-4-27 11:17 编辑
用bat可以删掉这样前四个字节,然后重新生成一个.png文件吗?(不更改文件名,只需要更改后缀)
作者: LTSC1809 时间: 2023-4-23 20:16
这个很难办,因为你这是用专用软件查看的,才能看到16进制码,而你用记事本打开就会发现全是乱码,而cmd只能读取文本,这个估计只能调用外部程序
作者: jyswjjgdwtdtj 时间: 2023-4-23 20:25
vbs可不可以?
作者: czjt1234 时间: 2023-4-23 20:51
本帖最后由 czjt1234 于 2023-4-23 20:54 编辑
- ' & cls & cscript.exe /nologo /e:vbscript "%~f0" "1.sct" "2.sct" & pause & exit
-
- Set oStream = CreateObject("ADODB.Stream")
- oStream.Type = 1 'adTypeBinary
- oStream.Mode = 3 'adModeReadWrite
- oStream.Open()
- With CreateObject("ADODB.Stream")
- .Type = 1 'adTypeBinary
- .Mode = 3 'adModeReadWrite
- .Open()
- .LoadFromFile WScript.Arguments(0)
- .Position = 4
- .CopyTo oStream
- .Close()
- End With
- oStream.SaveToFile WScript.Arguments(1), 2 'adSaveCreateOverWrite
- oStream.Close()
复制代码
作者: 老刘1号 时间: 2023-4-23 22:55
本帖最后由 老刘1号 于 2023-4-24 00:02 编辑
好久没写bat了,写个玩玩
仅供娱乐,速度奇慢,不建议使用
如果有bug请自行修复,不要找我,当然如果没有那更好了(x
输入:input.png
输出:new.png- @echo off
- setlocal ENABLEDELAYEDEXPANSION
- (
- for /f "skip=2 delims=" %%. in ('certutil input.png ^| find /v "CertUtil"') do (
- for /f "tokens=2-17 delims= " %%a in ("%%.") do (
- if defined prev (
- rem 这么写是因为最后一行得做特殊处理(certutil输出格式不标准)
- echo !prev!
- )
- if not defined t (
- rem 对第一行的16个hex,不显示前4个,就相当于丢掉了
- set t=啊
- rem 前四个hex也就是%%a %%b %%c %%d 扔掉,,
- set "prev=%%e %%f %%g %%h %%i %%j %%k %%l %%m %%n %%o %%p"
- ) else (
- set "prev=%%a %%b %%c %%d %%e %%f %%g %%h %%i %%j %%k %%l %%m %%n %%o %%p"
- )
- )
- set "lastline=%%."
- )
- rem echo !lastline!
- )> newhex.txt
- (
- rem 针对最后一行的特殊处理
- rem flag1 -> 读到了第一个非空格的字符
- rem flag2 -> 空格分割的第一个字符串读完了
- :trim
- set "char=!lastline:~,1!"
- rem echo !char!
- rem pause
- if "!char!" == " " (
- if "!flag1!" == "yes" set flag2=yes
- set "lastline=!lastline:~1!"
- ) else (
- if "!flag2!" == "yes" goto ok
- set flag1=yes
- set "lastline=!lastline:~1!"
- )
- goto trim
- :ok
- rem 观察certutil输出,hex部分最长48
- rem echo ll: !lastline!
- rem echo lltrim: !lastline:~,48!
- >>newhex.txt echo !lastline:~,48!
- )
- rem > newhex.txt
- certutil -decodehex newhex.txt new.png
- pause
复制代码
用certutil结合base64做一些处理也可以,不过太麻烦了我懒得写‘
那个newhex.txt是临时文件,运行完了之后可以删了
作者: cbbos 时间: 2023-4-27 11:14
回复 6# 老刘1号
感谢回复。 这个貌似没法使用,输出了txt,但是没png
作者: cbbos 时间: 2023-4-27 11:15
回复 5# czjt1234
感谢回复,显示 去头.bat(11, 5) ADODB.Stream: 文件无法被打开。
作者: cbbos 时间: 2023-4-27 11:17
回复 4# jyswjjgdwtdtj
你好,只要能做到都可以,bat目前好像没找到合适的方法
作者: czjt1234 时间: 2023-4-27 11:23
"1.sct" "2.sct"
这2个改成原始文件名,和修改后的文件名
作者: cbbos 时间: 2023-4-27 11:32
回复 10# czjt1234
这个可以,只是每次都要更改文件名,可以做到文件拖上去自动去掉前四字节,然后重新生成一个.png文件吗?(保持原文件名,只需要更改后缀)
作者: czjt1234 时间: 2023-4-27 12:36
"1.sct" "2.sct"
改成
"%~f1" "2.png"
作者: cbbos 时间: 2023-4-27 12:47
回复 12# czjt1234
感谢,最终完美代码。- ' & cls & cscript.exe /nologo /e:vbscript "%~f0" "%~f1" "%~n1.png" & pause & exit
-
- Set oStream = CreateObject("ADODB.Stream")
- oStream.Type = 1 'adTypeBinary
- oStream.Mode = 3 'adModeReadWrite
- oStream.Open()
- With CreateObject("ADODB.Stream")
- .Type = 1 'adTypeBinary
- .Mode = 3 'adModeReadWrite
- .Open()
- .LoadFromFile WScript.Arguments(0)
- .Position = 4
- .CopyTo oStream
- .Close()
- End With
- oStream.SaveToFile WScript.Arguments(1), 2 'adSaveCreateOverWrite
- oStream.Close()
复制代码
作者: cbbos 时间: 2023-4-27 17:44
回复 12# czjt1234
大佬这个批处理只能单个文件拖入,能实现一次拖入多个文件吗?
作者: czjt1234 时间: 2023-4-27 18:36
- ' & cls & cscript.exe /nologo /e:vbscript "%~f0" %* & pause & exit
-
- Set oFSO = CreateObject("Scripting.FileSystemObject")
- Set oStream = CreateObject("ADODB.Stream")
- oStream.Type = 1
- oStream.Mode = 3
- For Each i In WScript.Arguments
- oStream.Open()
- With CreateObject("ADODB.Stream")
- .Type = 1
- .Mode = 3
- .Open()
- .LoadFromFile i
- .Position = 4
- .CopyTo oStream
- .Close()
- End With
- oStream.SaveToFile oFSO.GetBaseName(i) & ".png", 2
- oStream.Close()
- WScript.Echo oFSO.GetBaseName(i) & ".png"
- Next
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |