Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2359063
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类:

2005-09-03 00:07:21

bash中处理二进制数据.

1. 不要用shell变量来保存二进制数据, 也不要用函数参数来作传递, 至今我还没看到严肃的声明说可以这样

2. xxd 是个名不见经传的工具, 但比它更闻名一些的od却不能把字符描述的进六进制反转成二进制数据.
xxd 来自vim安装包, 我在windows下安装完gvim也有一个伴随的xxd, 当你想生成一个数据量不大, 但内容却希望
随心所欲的时候, 它显得尤其有用
echo 410000000000000000000000 | xxd -r -ps > tmp.dat
你的tmp.dat第一个字符将会是A, 但其后的就都是真正的ASCII为0的字节.

3. tr 是为数不多的不跟文件名作参数的命令, 它只遵循一个原则, 从stdin读, 向stdout写.

4. 如何在用grep 取到目标串时获知它在文件中的准确偏移, 麻烦:
grep -ab regexp filename.txt
输出的格式是
123:pre - regexp - post
这个123只是这一行在文件中的偏移, 不是被找到的那个regexp, 你还得把这一行存起来, 想办法把regexp前面的部分长度求出来.
加上去. 总之是麻烦.

5. 如何改变某个文件中的其中一个字节
找到偏移处, 用 echo 03 | xxd -r -ps > tmp.dat 把要写的字节存入一个文件.
dd if=tmp.dat of=file.dat bs=1c seek=1000 conv=notrunc
最后一个参数是要命的, 否则你的输出文件 file.dat将会被截为0先.

6. 在DOS下编程注意什么
binmode(stdin), 不管是在perl中, C语言中都要注意这一点. 它的文件是区分文本方式和二进制方式的.
但运行了bash.exe作为命令解释器之后约定就跟UNIX是一样的了.
在DOS下把多个文件合并成一个的办法是:
copy /b file1+file2+file3 all_in_one
在UNIX下是
cat file1 file 2 file3 > all_in_one

7. 小心很多命令, 它们不是被设计成二进制数据的.

8. printf 可以把一个整数显示出来, 但我如何把它作为一个native的int存储在INTEL体系结构的机器中?
printf "%08x" 1234 | rev | sed 's#(.)(.)#21#g' | xxd -r -ps > tmp.dat

阅读(1234) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~