turncate

作者: 欧阳_z | 来源:发表于2020-06-28 15:05 被阅读0次

1.使用示例
truncate xxx.bin --size=8
如果文件 xxx.bin 不存在,则创建它,大小是 8 字节。
如果文件 xxx.bin 存在,超过 8 字节,则超出的数据将丢失。
如果文件 xxx.bin 存在,小于 8 字节,则用 0 补足。

2.应用场景
有时候可能需要自己构造一个 bin 文件,给程序用二进制的方式来读取,比如序列化的 struct 。
假设有一个 struct:
struct A
{
// 成员1,64字节,初值为0.
// 成员2,64字节,初值为0.
// 成员3,64字节,初值为其他程序的输出.
// 成员4,4字节,初值为一个 int 型数值。
}
第 1、2 个成员可以手动生成一个 bin 。

dd if /dev/zero of=zere.bin bs=1 count=64
cat zere.bin > target.bin
cat zere.bin >> target.bin

第 3 个成员也继续添加到后面,但是是别的程序生成的,
由于不是本脚本生成的,不能保证该文件刚好是 64 字节,
如果它大于 64 字节,得提示错误,
如果它不够 64 字节,我们还得手动填充 0,

if [ -f "member3.bin" ]
then
    cp member3.bin tmp.bin
    filesize=`ls -l tmp.bin | awk '{ print $5 }'`
    maxsize=64
    if [ $filesize -gt $maxsize ]
    then
        echo "error: $filesize > $maxsize"
        exit 1
    else
        truncate tmp.bin --size=$maxsize
        cat tmp.bin >> target.bin
    fi
else
    echo "error: No such file or directory"
    exit 1
fi

第 4 个成员是 int 型,通常是 Little-Endian,可以用 bash 的 ${string: start :length} 语法,或 cut 命令,或 awk 命令,写入到 bin 文件中。

data=12345678
echo ${data:6:2} | xxd -r -p > tmp.bin
echo ${data:4:2} | xxd -r -p >> tmp.bin
echo ${data:2:2} | xxd -r -p >> tmp.bin
echo ${data:0:2} | xxd -r -p >> tmp.bin
cat tmp.bin >> target.bin
echo ${data} |cut -b 7,8 | xxd -r -p > tmp.bin
echo ${data} |cut -b 5,6 | xxd -r -p >> tmp.bin
echo ${data} |cut -b 3,4 | xxd -r -p >> tmp.bin
echo ${data} |cut -b 1,2 | xxd -r -p >> tmp.bin
echo ${data} |awk '{print substr($1, 7, 2)}' | xxd -r -p > tmp.bin
echo ${data} |awk '{print substr($1, 5, 2)}' | xxd -r -p >> tmp.bin
echo ${data} |awk '{print substr($1, 3, 2)}' | xxd -r -p >> tmp.bin
echo ${data} |awk '{print substr($1, 1, 2)}' | xxd -r -p >> tmp.bin

3.坑
一次在shell脚本使用truncate命令时,单独运行该脚本,用 xxd 来查看生成的 bin 的内容是对的,放到环境中自测也没问题,但别人测试的时候运行却出错了,查看发现该 struct 没有对齐,该填充 0 的地方没有填充 0 。也就是 turncate 命令没有生效。
检查安卓的完整编译的 log 发现有一个报错:
"truncate" is not allowed to be used.
See https://android.googlesource.com/platform/build/+/master/Changes.md#PATH_Tools for more information.

truncate 不被允许,那只能暂时写一个 shell 函数来替代它:

function fill_zero()
{
    local filename=$1
    local target_size=$2
    local size=$(ls -l ${filename} |awk '{print $5}')
    for ((i=$size;i<${target_size};i++))
    do
        echo 00 |xxd -r -p >> ${filename}
    done
}

原来的
truncate tmp.bin --size=64
改为
fill_zero tmp.bin 64
可以生效。

相关文章

  • turncate

    1.使用示例truncate xxx.bin --size=8如果文件 xxx.bin 不存在,则创建它,大小是 ...

网友评论

      本文标题:turncate

      本文链接:https://www.haomeiwen.com/subject/nhxwfktx.html