如何用shell替换/替换二进制文件中的字节

时间:2013-03-12 13:49:49

标签: shell byte block dd substitution

是否可以在循环中用 dd 将二进制文件 myfile 中的字节从一个特定位置替换为另一个特定位置,或者使用其他命令更方便?

我们的想法是在位置位置2 处替换块 B ,在位置1 处阻止 A

PSEUDO CODE

  @ l = 0

  while (l <= bytelength of myfile)
      copy myfile (from position1 to A+position1)  myfile from (position2 to B+position2)
      @ position1 = position1+steplength
      @ position2 = position2+steplength
      @ l = l+steplength

  end

1 个答案:

答案 0 :(得分:0)

文本文件中的以下代码行将大致符合您的要求(我认为):将文件从一个位置复制到另一个位置,但用一个块替换另一个位置的一个字节块;它根据要求使用dd。但是,它确实创建了一个单独的输出文件 - 这对于确保不存在冲突是必要的,无论“输入”块是在“替换”块之前还是之后发生。请注意,如果A和B之间的距离小于要替换的块的大小,它将不会执行任何操作 - 这将导致重叠,并且不清楚您是否希望重叠区域中的字节为“结束一个“或”A的副本的开头。

将其保存在名为blockcpy.sh的文件中,并更改权限以包含execute(例如chmod 755 blockcpy.sh)。用

运行它
./blockcpy.sh inputFile outputFile from to length

请注意,“from”和“to”偏移量的基数为零:所以如果要复制从文件开头开始的字节,from参数为0

以下是文件内容:

#!/bin/bash
# blockcpy file1 file2 from to length
# copy contents of file1 to file2
# replacing a block of bytes at "to" with block at "from"
# length of replaced block is "length"
blockdif=$(($3 - $4))
absdif=${blockdif#-}
#echo 'block dif: ' $blockdif '; abs dif: ' $absdif
if [ $absdif -ge $5 ]
  then
    # copy bytes up to "to":
    dd if=$1 of=$2 bs=$4 count=1 status=noxfer 2>0
    # copy "length" bytes from "from":
    dd bs=1 if=$1 skip=$3 count=$5 status=noxfer 2>0 >> $2
    # copy the rest of the file:
    rest=$((`cat $1 | wc -c` - $4 - $5))
    skip=$(($4 + $5))
    dd bs=1 if=$1 skip=$skip count=$rest status=noxfer 2>0 >> $2
    echo 'file "'$2'" created successfully!'
  else
    echo 'blocks A and B overlap!'
fi

2>0“'nix magic”会抑制stderr的输出,否则输出会显示在输出中(类型为“16+0 records in”)。