二进制.bin文件切分(shell和python两种方式)

今天工作遇到一个问题,将128MB随机数的二进制文件进行切分为每个128KB随机数,首先度娘到python脚本实现的,简单修改了一下脚本发现可以将128MB的数据拆分128KB然后存入对应的文件;

测试脚本:

# -*- coding: utf-8 -*- 
#按照大小分割文件
 
import os
 
filename = "/home/ndsec/Downloads/random/random_hsm1.bin"#需要进行分割的文件,请修改文件名
size = 131072 #分割大小约128K
 
def mk_SubFile(srcName,sub,buf):
    [des_filename, extname] = os.path.splitext(srcName)
    filename  = des_filename + '_' + str(sub) + extname
    print( '生成子文件ing: %s' %filename)
    with open(filename,'wb') as fout:
        fout.write(buf)
        return sub+1
            
            
def split_By_size(filename,size):
    with open(filename,'rb') as fin:
        buf = fin.read(size)
        sub = 1
        while len(buf)>0:
            sub = mk_SubFile(filename,sub,buf)
            buf = fin.read(size)  
    print("ok")
            
 
if __name__=="__main__":
    split_By_size(filename, size)

上面代码可以很快将文件切分,但是发现使用这些切分后的文件进行测试随机数并不是预期的结果,所以对拆分后的结果严重怀疑,但是#这种方法是按照大小分割文件,会存在同一行被分割在两个文件中的情况,因此此种情况不可避免进行;但是不确定是不是因为这个原因但是肯定分割出现了问题;因此接下来使用shell脚本:dd命令直接进行分割:

#!/bin/bash

#使用脚本是第一参数是要分割的文件名
Filename=$1   
Filesize=0
echo $Filename
Path=`pwd`
echo $Path

#验证文件名是否正确,然后计算文件的大小
if [ -z $Filename ];then
    echo "Error:The file name can not be empty"
    exit
fi
if [ -e $Filename ];then
    Filesize=`du -b $Filename | awk '{print $1}'`
    if [ $Filesize == 0 ];then
    	echo "Error:The File size is zero!"
    	exit
    fi
    echo "The file size is $Filesize Byte"
#    echo "Plese enter the subfile size(KB):"
else
    echo "Error:$Filename does not exist!"
    exit 
fi

#输入分割后每个文件的大小,单位是KB
Subfilesize=128
#if [ -z $Subfilesize ];then
#    echo "Error:Input can not be empty"
#    exit
#fi

#echo $Subfilesize | grep '^[0-9]+$' >> /dev/null
#if [ $? -ne 0 ];then
#    echo "Error:The Input is not a number!"
#    exit
#elif [ $Subfilesize -eq 0 ];then
#    echo "Error:The Subfile size is zero!"
#    exit
#fi

#计算需要分割为几个文件
SubfileByte=131072
Subfilenum=1024
if [ `expr $Filesize % $Subfilesize` -ne 0 ];then
    Subfilenum = `expr $Subfilenum + 1`
fi

#将文件分割
echo "$Filename will be divided into $Subfilenum" 
i=1
skipnum=0
while [ $i -le $Subfilenum ]
do
    echo "$Filename$i"
    dd if=$Filename of="$i.bin" bs=1024 count=$Subfilesize skip=$skipnum
#    i = `expr $i + 1`
	((i++))
    skipnum= `expr $skipnum + $Subfilesize`
done
echo "$Filename has been divided into $Subfilenum"
echo "Done !"

上面的脚本很多都是写死的数据,如果又需要的可以自行修改(这个脚本是在ubuntu系统下的);

参考了此文章(非常感谢作者),Linux下分割、合并文件——dd和cat - 走看看

执行脚本:

cd /home/ndsec/Downloads/random/
/bin/bash split.sh random.bin

使用此脚本分割后查看每个分割的文件大小,用命令ll查看不要直接在ubuntu文件夹查看(会有出入)

 此时再去检测脚本中,执行测试case:发现符合预期结果(符合标准的128MB数据测试符合)

./nist_sts_test >>random_qulity.log

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值