android 分割二进制文件的Windows命令

f45qwnt8  于 2023-06-04  发布在  Android
关注(0)|答案(3)|浏览(224)

我想把一个二进制文件分割成更小的块。有谁知道Windows命令吗?
由于Android的UNCOMPRESS_DATA_MAX约束,我无法用1MB或更大的文件覆盖数据库。所以如果有更好的方法,我也可以接受。

e0bqpujr

e0bqpujr1#

方法一:

makecab可以将一个二进制文件分割成更小的编码块,但它们不能被视为原始字节,类似于平面二进制文件,例如。通过copy ie加入。如果您正在查看通过CMD编辑二进制文件,例如。文件修补但是,如果您只是想拆分文件,然后在不进行编辑的情况下将其合并为一个块,则可以通过extrac32将这些块连接起来。
例如,要使用makecab分割二进制文件,然后使用extrac32连接,首先创建一个ddf(文本)文件:

.Set CabinetNameTemplate=test_*.cab; <-- Enter chunk name format
.Set MaxDiskSize=900000; <-- Enter file split/chunk size
.Set ClusterSize=1000
.Set Cabinet=on;
.Set Compress=off;
.set CompressionType=LZX;
.set CompressionMemory=21
.Set DiskDirectoryTemplate=;
file.in

然后:

rem Optional: set compression on to save disk space
makecab /f ddf.txt

要取回原始文件,请确保所有区块都在同一个目录中:

REM join by calling 1st file in the sequence
extrac32 test_1.cab file.out

MakeCAB引入了文件夹的概念来引用一组连续的压缩字节。
MakeCAB获取要压缩的产品或应用程序中的所有文件,将字节作为一个连续的字节流放置,压缩整个流,根据需要将其分割到文件夹中,然后用文件夹填充一个或多个文件柜。

**方法二:**对于原始字节块,powershell可以拆分文件:

set size=1000000
set file=test.mp3

for %j in (%file%) do (
set /a chunks=%~zj/%size% >nul

for /l %i in (0,1,!chunks!) do (
set /a tail=%~zj-%i*%size% >nul
powershell gc %file% -Encoding byte -Tail !tail! ^| sc %file%_%i -Encoding byte
if %i lss !chunks! FSUTIL file seteof %file%_%i %size% >nul
)
)

**方法3:**via certutil & CMD:

set file="x.7z"             &REM compressed to generate CRLF pairs
set max=70000000            &REM certutil has max file limit around 74MB

REM Findstr line limit 8k
REM Workaround: wrap in some archive to generate CRLF pairs

for %i in (%file%) do (
set /a num=%~zi/%max% >nul      &REM No. of chunks
set /a last=%~zi%%max% >nul     &REM size of last chunk
if %last%==0 set /a num=num-1       &REM ove zero byte chunk
set size=%~zi
)

ren %file% %file%.0

for /l %i in (1 1 %num%) do (
set /a s1=%i*%max% >nul
set /a s2="(%i+1)*%max%" >nul
set /a prev=%i-1 >nul

echo Writing %file%.%i
type %file%.!prev! | (
  (for /l %j in (1 1 %max%) do pause)>nul& findstr "^"> %file%.%i)

FSUTIL file seteof %file%.!prev! %max% >nul
)
if not %last%==0 FSUTIL file seteof %file%.%num% %last% >nul
echo Done.

备注:

1.块可以通过copy /b连接
1.通过填充块号可以使文件名扩展名更整洁
1.可以循环以拆分整个目录
参见下面的示例输出:

Directory of C:\Users\Stax\Desktop\Parking

03/05/2022  01:04    <DIR>          .
03/05/2022  01:04    <DIR>          ..
03/05/2022  01:04               407 Court Notice.pdf.000
03/05/2022  01:04             4,000 Court Notice.pdf.001
03/05/2022  01:04             4,000 Court Notice.pdf.002
03/05/2022  01:04               557 Parking fine.pdf.000
03/05/2022  01:04             4,000 Parking fine.pdf.001
03/05/2022  01:04             4,000 Parking fine.pdf.002
03/05/2022  01:04             4,000 Parking fine.pdf.003
03/05/2022  01:04             4,000 Parking fine.pdf.004
               8 File(s)         24,964 bytes

方法2和3可以通过copy连接
在Win 10上测试

2nc8po8w

2nc8po8w2#

没有内置的DOS命令。使用dos port of the unix split command

split BIGFILE -b 1000000

有第三方的替代品,但这是最简单的。

wko9yo5t

wko9yo5t3#

您也可以从http://gnuwin32.sourceforge.net安装GnuWin
对于我的工作,我需要从一个大的Oracle导出文件DataBase.bak中提取一些行。
此文件是一个二进制文件,它是文本行和二进制行的混合。
要提取两个特定行之间的所有行,我只需输入以下命令

split -l 4114807 database.bak from.
split -l 10357 from.A to.
copy to.A database.RANGE.bak

第一个命令将从0到4114807的所有行提取到from.A文件中,并将从4114808到24114807的所有行提取到from.B文件中。
我在Notepad++中加载Database.Bak文件时发现FROM行号(= 4114807)。
注意:Notepad中显示的行号不等于split命令中使用的l参数,因为Notepad行号是由LFCR字符生成的!
我使用第二个命令将.B文件中包含的所有前10357行提取到to.A文件中。
要终止,我将to.A文件复制到包含所需提取的新Database.RANGE.bak文件中。
当工作完成后,我删除所有从.
和到.* 文件从当前目录。

相关问题