今天工作遇到一个问题,将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