在UNIX中创建二进制文件

jay*_*ngh 9 bash parsing hexdump binaryfiles xxd

这个问题已经存在了一段时间,如果我可以让它工作,我认为我应该提供一些奖励积分.

我做了什么......

最近在工作中,我写了一个解析器,它将以可读格式转换二进制文件.二进制文件不是带10101010字符的Ascii文件.它已经以二进制编码.所以如果我cat在文件上做一个,我得到以下 -

[jaypal~/Temp/GTP]$ cat T20111017153052.NEW 
==?sGTP???N????W????&Xx1?T?&Xx1?;
?d@#e?
      ?0H????????|?X?@@(????VtPOC01
cceE??k@9??W???R?K?i2??d@#e???&Xx1&Xx??!?
blackberrynet?/??!

??!

??#ripassword??W??W???0H??
                            #R??@Vtc@@(????n?POC01
Run Code Online (Sandbox Code Playgroud)

所以我使用hexdump实用程序使文件显示在内容之后并将其重定向到文件.现在我的输出文件是一个包含Hex值的文本文件.

[jaypal~/Temp/GTP]$ hexdump -C T20111017153052.NEW 
00000000  3d 3d 01 f8 73 47 54 50  02 f1 d5 b2 be 4e e4 d7  |==..sGTP.....N..|
00000010  00 01 01 00 01 80 00 cc  57 e5 82 00 00 00 00 00  |........W.......|
00000020  00 00 00 00 00 00 00 00  87 d3 f5 13 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 01 00 10  |................|
00000040  01 01 0f 00 00 00 00 00  26 58 78 31 00 b3 54 c5  |........&Xx1..T.|
00000050  26 58 78 31 00 b4 3b 0a  00 00 ad 64 13 40 01 03  |&Xx1..;....d.@..|
00000060  23 16 65 f3 01 01 0b 91  30 19 48 99 f2 ff ff ff  |#.e.....0.H.....|
00000070  ff ff ff 02 00 7c 00 dc  01 58 00 a0 40 40 28 02  |.....|...X..@@(.|
00000080  f1 d5 b2 b8 ca 56 74 50  4f 43 30 31 00 00 00 00  |.....VtPOC01....|
00000090  00 04 0a 63 63 07 00 00  00 00 00 00 00 00 00 00  |...cc...........|
000000a0  00 00 00 65 45 00 00 b4  fb 6b 40 00 39 11 16 cd  |...eE....k@.9...|
000000b0  cc 57 e5 82 87 d3 f5 52  85 a1 08 4b 00 a0 69 02  |.W.....R...K..i.|
000000c0  32 10 00 90 00 00 00 00  ad 64 00 00 02 13 40 01  |2........d....@.|
Run Code Online (Sandbox Code Playgroud)

之后万吨awk,sedcut,脚本转换十六进制值成可读的文本.为此,我使用偏移定位来标记转换的每个参数的开始和结束位置.所有转换后生成的文件都是这样的

[jaypal:~/Temp/GTP] cat textfile.txt 
Beginning of DB Package Identifier: ==
Total Package Length: 508
Offset to Data Record Count field: 115
Data Source: GTP
Timestamp: 2011-10-25
Matching Site Processor ID: 1
DB Package format version: 1
DB Package Resolution Type: 0
DB Package Resolution Value: 1
DB Package Resolution Cause Value: 128
Transport Protocol: 0
SGSN IP Address: 220.206.129.47
GGSN IP Address: 202.4.210.51
Run Code Online (Sandbox Code Playgroud)

我为什么这样做

我是一名测试工程师,手动验证二进制文件是一个很大的痛苦.我不得不手动解析偏移并使用计算器转换它们并根据Wireshark和GUI进行验证.

现在问题部分

我希望与我所做的相反.这是我的计划 -

  • 有一个易于阅读的输入文本文件Parameters : Values.
  • 用户可以简单地将值放在它们旁边(例如,Date将是一个参数,用户可以给出他们希望数据文件具有的日期).
  • 该脚本将从输入文本文件中删除所有相关信息(用户提供的信息)并将其转换为十六进制值.
  • 一旦文件转换为十六进制值,我希望将其编码回二进制.

前三个步骤完成

问题

一旦我的脚本输入文本文件转换到十六进制值的文本文件,我得到这样一个文件如下(请注意,我能做的cat就可以了).

[visdba@hw-diam-test01 ParserDump]$ cat temp_file | sed 's/.\{32\}/&\n/g' | sed 's/../& /g'
3d 3d 01 fc 73 47 54 50 02 f1 d6 55 3c 9f 49 9c
00 01 01 00 01 80 00 dc ce 81 2f 00 00 00 00 00
00 00 00 00 00 00 00 00 ca 04 d2 33 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10
01 01 0f 00 00 07 04 ea 00 00 ff ff 00 00 14 b7
00 00 ff ff 00 00 83 ec 00 00 83 62 54 14 59 00
60 38 34 f5 01 01 0b 58 62 70 11 60 f6 ff ff ff
ff ff ff 02 00 7c 00 d0 01 4c 00 b0 40 40 28 02
f1 d6 55 38 cb 2b 23 50 4f 43 30 31 00 00 00 00
00 04 0a 63 63 07 00 00 00 00 00 00 00 00 00 00
Run Code Online (Sandbox Code Playgroud)

我的意图是将这个转换后的文件编码二进制文件,这样当我cat对文件进行编码时,我会得到一堆垃圾值.

[jaypal~/Temp/GTP]$ cat temp.file 
==?sGTP???N????W????&Xx1?T?&Xx1?;
?d@#e?
      ?0H????????|?X?@@(????VtPOC01
cceE??k@9??W???R?K?i2??d@#e???&Xx1&Xx??!?
blackberrynet?/??!

??!
Run Code Online (Sandbox Code Playgroud)

所以问题是这个.我如何以这种形式编码?

我为什么要这样做?

生产中我们没有很多GTP(GPRS隧道协议)消息.我想如果我对此进行逆向工程,我可以有效地创建数据生成器并创建自己的数据.

总结一下

可能有复杂的工具,但我不想花太多时间学习它们.它已经约2个月,我已经开始工作了*nix的平台上,刚开始手握住它的力量工具,如sedawk.

我想要的是一些帮助和指导,以实现这一目标.

再次感谢您的阅读!对于那些可以指导我正确方向的人来说,等待200分.:)

示例文件

这是原始二进制文件的示例

以下是输入文本文件的示例,该示例允许用户打入值

下面是我的脚本在输入文本文件的所有转换完成后创建的File示例.

如何更改的编码File 3File 1

小智 15

您可以非常简单地使用xxd与二进制文件/ hexdump进行转换.

数据到十六进制

echo  Hello | xxd -p 
48656c6c6f0a
Run Code Online (Sandbox Code Playgroud)

十六进制数据

echo 48656c6c6f0a | xxd -r -p
Hello
Run Code Online (Sandbox Code Playgroud)

要么

echo 48 65 6c 6c 6f 0a | xxd -r -p
Hello
Run Code Online (Sandbox Code Playgroud)

-p是后记模式,其允许更自由形式输入

这是xxd -r -p text文本是您上面提供的数据的输出

==?sGTP??U<?I????/??3?????????bTY`84?
                                     Xbp`???????|?L?@@(??U8?+#POC01
:??v?b????TY`84Ud????>???????!?
blackberrynet?/??!
M
??!
N
??#Oripassword???/???/??Xbp`?@@(??U8?IvPOC01
:qU?b??????TY`84U???*:??!
?k???#O Welcmme!
?!
M
Run Code Online (Sandbox Code Playgroud)