计算存储在变量中的字段数

时间:2013-01-12 21:48:25

标签: bash xxd

我正在研究一个基本的文件雕刻工具,我目前仍然在计算文件的字节位置。

我已经知道我需要一段代码才能执行以下步骤;

  1. 在变量
  2. 中找到$ searchQuery
  3. 找到$ searchQuery后删除其余字符串
  4. 计算变量
  5. 中现在存在的字段数
  6. 从此变量开始减去2以考虑Hex Offset和$ searchQuery本身
  7. 然后将答案乘以2以获得正确的字节数
  8. 这样的一个例子是;

    1. 在“00052a0:b4f1 559c ffd8 ffe0 0010 4a46 4946 0001”中找到“ffd8”
    2. 变量更新为“00052a0:b4f1 559c ffd8”
    3. $ fieldCount被赋值为“4”
    4. $段计数=((字段计数-2))
    5. $ BYTECOUNT =((字段计数* 2))
    6. 我有一个基本的想法,即如何做所有事情,但计算变量中的字段数。例如,在找到$ 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
      

      感谢您的帮助!

1 个答案:

答案 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 :