我正在研究一个基本的文件雕刻工具,我目前仍然在计算文件的字节位置。
我已经知道我需要一段代码才能执行以下步骤;
这样的一个例子是;
我有一个基本的想法,即如何做所有事情,但计算变量中的字段数。例如,在找到$ searchQuery之前,我如何计算变量中有多少个字段?同样,一旦我删除了字符串中不必要的部分,我如何计算字段数?
使用grep查找$ searchString后我不知道如何继续。我目前的代码看起来像这样;
#!/bin/bash
#***************************************************************
#Name: fileCarver.sh
#Purpose: Extracts files hidden within other files
#Author:
#Date Written: 12/01/2013
#Last Updated: 12/01/2013
#***************************************************************
clear
#Request user input
printf "Please enter the input file name: "
read inputFile
printf "Please enter the search string: "
read searchString
#Search for the required string
searchFunction()
{
#Search for required string and remove unnecessary characters
startHexOffset=`xxd $1 | grep $2 | cut -d":" -f 1`
#Convert the Hex Offset to Decimal
startDecOffset=$(echo "ibase=16;${startHexOffset^^}" | bc)
}
searchFunction $inputFile $searchString
exit 0
感谢您的帮助!
答案 0 :(得分:0)
如果您以更简单的格式将文件转换为十六进制,您可能会发现这更容易。例如,您可以使用命令
hexdump -v -e '/1 "%02x "' $FILE
打印文件,每个字节转换为正好三个字符:两个十六进制数字和一个空格。
您可以找到所有以ffd8
为前缀的字节偏移量的实例:
hexdump -v -e '/1 "%02x "' $FILE | grep -Fbo 'ff d8 '
(字节偏移需要除以3。)
因此,您可以使用以下内容从ffd8
的第一个实例流式传输整个文件:
tail -c+$((
$(hexdump -v -e '/1 "%02x "' $FILE | grep -Fbo 'ff d8 ' | head -n1 | cut -f1 -d:)
/ 3 + 1)) $FILE
(假设你用来显示文件的任何内容都知道在它到达图像末尾时就停止了。但是你可以类似地找到最后一个结束标记。)
这取决于GNU grep;标准Posix grep缺少-b选项。但是,可以使用awk
:
tail -c+$(
hexdump -v -e '/1 "%02x\n"' $FILE |
awk '/d8/&&p=="ff"{print NR-1;exit}{p=$1}'
) $FILE
选项说明:
tail -c+N file starting at byte number N (first byte is number 1)
hexdump -v do not compress repeated lines on output
-e 'FORMAT' use indicated format for output:
/1 each format consumes 1 byte
"%02X " output two hex digits, including leading 0, using lower case,
followed by a space.
grep -F pattern is just plain characters, not a regular expression
-b print the (0-based) byte offset of the...
-o ... match instead of the line containing the match
cut -f1 output the first field of each line
-d: fields are separated by :