打印

【训练编程】有时间的朋友练练手吧

【训练编程】有时间的朋友练练手吧

有个文件叫datafile001.hex,下面是内容,
:020000040000FA
:020000040010EA
:1049440000000000FF7F8C04FF7F0309FF7F4A0DF6
:10495400FFFF4D11FF7FF614FF7F3218FF7FF11A1E
:10496400FFFF231DFF7FBF1EFF7FBB1FFFFF122022
:10497400FFFFC31FFF7FD01EFFFF3C1DFF7F111BE6
:10498400FFFF5918FFFF2315FFFF7F11FFFF810D64
:10499400FF7F3D09FFFFC704FF7F3B000000ADFB25
:1049A400000035F70000EAF20000E3EE008036EB89
:1049B4000000F4E700802EE50000F5E2000051E17C
:1049C40000004DE00000EDDF000034E000001FE1D6
:1049D4000000ABE20080CFE4000080E70080B0EA92
:1049E40000804EEE000049F200808BF60080FDFA54
:1049F40000808AFFFF7F1904FFFF9208FF7FE00C0D
:104A0400FF7FEA10FF7F9D14FF7FE517FFFFB01AB9
:104A1400FFFFF11CFF7F9D1EFF7FA91FFFFF1120D9
:104A2400FFFFD31FFFFFEF1EFF7F6B1DFFFF4F1B19
:104A3400FF7FA518FFFF7A15FFFFE111FFFFEA0DC5
:00000001FF

前面2行和最后一行,表示该文件的开头和结束。
中间的行包含着我们要的数据,左边的9列和右边的2列都不是需要的数据,比如第四行的内容是
:10495400FFFF4D11FF7FF614FF7F3218FF7FF11A1E
那么有效数据是第10列开始到倒数第3列之间的东西,如下
FFFF4D11FF7FF614FF7F3218FF7FF11A
而这样的每一行里共有4个数据,每个数据是8位的16进制,排列是由低位到高位
FFFF4D11
FF7FF614
FF7F3218
FF7FF11A
正常排过来这4个数据应该是这样的
114DFFFF
14F67FFF
18327FFF
1AF17FFF
很好,看到这里大家猜出来我要干什么了吧?请你编个程序,把这样的文件拿来后,整理出他们所有的数据来,而且一行只放一个数据。
这个题不难吧?方法有很多种,你会哪种方法你就用哪种方法挑战一下。有时间的玩玩,没时间的路过。
我看看大家的招数多不多。   

TOP

问题解决了,方法有点笨,我相信有更好的办法,大家谁有更好的内容也up上来交流交流吧。
下面是我弄的。
我因为是在windows XP上折腾,改行和linux呀unix他们有点区别,大家到时候注意一下。
复制内容到剪贴板
代码:
#!/bin/bash
`awk 'NR>2' $1 | cut -c 10-41 | awk 'NR<$NF-1'>$3`
`cat $3| cut -c 1-2>t001.txt`
`cat $3 | cut -c 3-4>t002.txt`
`cat $3 | cut -c 5-6>t003.txt`
`cat $3 | cut -c 7-8>t004.txt`
`cat $3 | cut -c 9-10>t005.txt`
`cat $3 | cut -c 11-12>t006.txt`
`cat $3 | cut -c 13-14>t007.txt`
`cat $3 | cut -c 15-16>t008.txt`
`cat $3 | cut -c 17-18>t009.txt`
`cat $3 | cut -c 19-20>t010.txt`
`cat $3 | cut -c 21-22>t011.txt`
`cat $3 | cut -c 23-24>t012.txt`
`cat $3 | cut -c 25-26>t013.txt`
`cat $3 | cut -c 27-28>t014.txt`
`cat $3 | cut -c 29-30>t015.txt`
`cat $3 | cut -c 31-32>t016.txt`
`paste -d "" t004.txt t003.txt t002.txt t001.txt>data001.txt`
`paste -d "" t008.txt t007.txt t006.txt t005.txt>data002.txt`
`paste -d "" t012.txt t011.txt t010.txt t009.txt>data003.txt`
`paste -d "" t016.txt t015.txt t014.txt t013.txt>data004.txt`
`paste -d "\r" data001.txt data002.txt data003.txt data004.txt>$2`
`nkf -Sed $2>$3`

TOP

楼上的程序,能说说怎么实现么   不懂
在技术中 比日语
在日语中 比技术
在BSE中 比帅气

TOP

引用:
原帖由 5miao 于 2008-7-1 17:11 发表
楼上的程序,能说说怎么实现么   不懂
我写的代码是shell方面的程序,你把那东西存盘为扩展名sh的东西,比如说runit.sh, 然后你把它用chmod命令变成可执行的。
chmod 700 runit.sh
我是在windows环境运行的,所以我为了让awk啊 cut啊 还有paste等命令可以运行,我必须安装cygwin的东西。
在linux上面或者unix上面就不用这么麻烦了。
还有一个是,你如果像我一样在windows上搞这个东西,保存的这个文件runit.sh要把他的文件代码转换为windows可以识别的东西,因为在windows和linux或unix方面,他们的改行换行符是不同的。
所以你需要用到nkf这个命令,
nkf -Sed runit.sh >runitInWindows.sh
上面这个命令的意思是把runit.sh这个文件的形式变为windows上可以识别的文件runitInWindows.sh,也就是说把他们的改行换行符变为windows可以识别的东西。
然后你可以运行runitInWindows.sh了
格式为 命令 第一参数 第二参数 第三参数 【回车】
例子 runitInWindows.sh org.hex tmp.txt outputfile.log【回车】
runitInWindows.sh 就是命令了
org.hex 就是第一参数,也就是输入文件
tmp.txt 是第二参数,是个中间的临时文件
outputfile.log 是第三参数,是最终输出文件
运行结束后,你打开outputfile.log 文件看结果就是了,与此同时还会生成好几个txt扩展名的文件。
你看没有用就删除了,我原本可以把删除这些中间文件的命令都加入runitInWindows.sh中的,
但是考虑到怕误删你们目录里的东西,那部分你们自己加吧。
我用的办法是笨办法,其实比这个方法好的还有,我们互相交流学习吧。

[ 本帖最后由 grandpa 于 2008-7-2 10:42 编辑 ]

TOP

ls是个shell大拿

TOP