忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
论坛 程序设计 Perl 求助
12下一页
最近访问板块 发新帖
查看: 1916 | 回复: 10

求助 [复制链接]

论坛徽章:
0
发表于 2017-09-21 11:40 |显示全部楼层
求助,我有一个txt文档,类似于以下格式。每连续的4个数字是一个16进制数,这四个数字里,前两个是低位后两位是高位。
类似于0000,0081,0101,0182这样。

111.txt
00008100010182010202820203038403040485040505860506068706070788070808890809098A090A0A8B0A0B0B8C0B0C0C8D0C0D0D8E0D0E0E8F0E0F0F900F0010
00004000A10001017101D2014202A302230394031404950405057505E6055606D7064707B8073808C9085909EA096A0ADB0A3B0B9C0B0C0C8D0C1D0DAE0D4E0EDF0E
000091003101D2015202F30284031404A5042505A6052606A70617078807080899083909CA094A0ABB0A1B0B7B0BDC0B4C0CBD0C3D0DBE0D4E0EDF0E5F0FC00F0010
00007000E1005101D2014202B3022303A40314048504F5047505E6055606C7064707B8072808990819098A09FA096A0AEB0A5B0BCC0B3C0CBD0C2D0D9E0D0E0E7E0E


我想得到每个对应的十进制数字。要转成十进制,再除以16,得到如下:
gam.txt
0   8.0625   16.0625   24.125   32.125   40.125   48.1875   56.25   64.25   72.3125   80.3125   88.375   96.375   104.4375   112.4375   120.5   128.5   136.5625   144.5625   152.625   160.625   168.6875   176.6875   184.75   192.75   200.8125   208.8125   216.875   224.875   232.9375   240.9375   249   256
0   4   10.0625   16.0625   23.0625   29.125   36.125   42.1875   50.1875   57.25   65.25   73.3125   80.3125   87.3125   94.375   101.375   109.4375   116.4375   123.5   131.5   140.5625   149.5625   158.625   166.625   173.6875   179.6875   185.75   192.75   200.8125   209.8125   218.875   228.875   237.9375
0   9.0625   19.0625   29.125   37.125   47.1875   56.25   65.25   74.3125   82.3125   90.375   98.375   106.4375   113.4375   120.5   128.5   137.5625   147.5625   156.625   164.625   171.6875   177.6875   183.6875   189.75   196.75   203.8125   211.8125   219.875   228.875   237.9375   245.9375   252   256
0   7   14.0625   21.0625   29.125   36.125   43.1875   50.1875   58.25   65.25   72.3125   79.3125   87.3125   94.375   101.375   108.4375   116.4375   123.5   130.5   137.5625   145.5625   152.625   159.625   166.625   174.6875   181.6875   188.75   195.75   203.8125   210.8125   217.875   224.875   231.875



我的程序如下,我觉得我写的太麻烦了,刚入门没多久,看大神们有简单写法没。
#!/usr/bin/perl

open A,"111.txt"or die "$!";
open B,">","gma_16.txt"or die "$!";

while(<A>){
@a=$_=~/\w{2}/g;
print B "$a[1]$a[0]   $a[3]$a[2]   $a[5]$a[4]   $a[7]$a[6]   $a[9]$a[8]   $a[11]$a[10]   $a[13]$a[12]   $a[15]$a[14]   $a[17]$a[16]   $a[19]$a[18]   $a[21]$a[20]   $a[23]$a[22]   $a[25]$a[24]   $a[27]$a[26]   $a[29]$a[28]   $a[31]$a[30]   $a[33]$a[32]   $a[35]$a[34]   $a[37]$a[36]   $a[39]$a[38]   $a[41]$a[40]   $a[43]$a[42]   $a[45]$a[44]   $a[47]$a[46]   $a[49]$a[48]   $a[51]$a[50]   $a[53]$a[52]   $a[55]$a[54]   $a[57]$a[56]   $a[59]$a[58]   $a[61]$a[60]   $a[63]$a[62]   $a[65]$a[64] \n";
}
close A;
close B;

open GMA,">","gma.txt"or die "$!";
open B,"gma_16.txt"or die "$!";

while(<B>){
@b=split/\s+/,$_;
#$_=hex($_)/16;

$b[0]=hex($b[0])/16;
$b[1]=hex($b[1])/16;
$b[2]=hex($b[2])/16;
$b[3]=hex($b[3])/16;
$b[4]=hex($b[4])/16;
$b[5]=hex($b[5])/16;
$b[6]=hex($b[6])/16;
$b[7]=hex($b[7])/16;
$b[8]=hex($b[8])/16;
$b[9]=hex($b[9])/16;
$b[10]=hex($b[10])/16;
$b[11]=hex($b[11])/16;
$b[12]=hex($b[12])/16;
$b[13]=hex($b[13])/16;
$b[14]=hex($b[14])/16;
$b[15]=hex($b[15])/16;
$b[16]=hex($b[16])/16;
$b[17]=hex($b[17])/16;
$b[18]=hex($b[18])/16;
$b[19]=hex($b[19])/16;
$b[20]=hex($b[20])/16;
$b[21]=hex($b[21])/16;
$b[22]=hex($b[22])/16;
$b[23]=hex($b[23])/16;
$b[24]=hex($b[24])/16;
$b[25]=hex($b[25])/16;
$b[26]=hex($b[26])/16;
$b[27]=hex($b[27])/16;
$b[28]=hex($b[28])/16;
$b[29]=hex($b[29])/16;
$b[30]=hex($b[30])/16;
$b[31]=hex($b[31])/16;
$b[32]=hex($b[32])/16;

print GMA "$b[0]   $b[1]   $b[2]   $b[3]   $b[4]   $b[5]   $b[6]   $b[7]   $b[8]   $b[9]   $b[10]   $b[11]   $b[12]   $b[13]   $b[14]   $b[15]   $b[16]   $b[17]   $b[18]   $b[19]   $b[20]   $b[21]   $b[22]   $b[23]   $b[24]   $b[25]   $b[26]   $b[27]   $b[28]   $b[29]   $b[30]   $b[31]   $b[32]\n";
}

close GMA;


original data

original data

论坛徽章:
120
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07巳蛇
日期:2014-05-09 16:43:18巨蟹座
日期:2014-10-23 17:48:38子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59
发表于 2017-09-21 12:21 |显示全部楼层
回复 1# Innocencer

$ perl Hex.pl
Output: gma.txt

$ cat gma.txt
0    8.0625    16.0625    24.125    32.125    40.125    48.1875    56.25    64.25    72.312580.3125    88.375    96.375    104.4375    112.4375    120.5    128.5    136.5625144.5625    152.625    160.625    168.6875    176.6875    184.75    192.75    200.8125    208.8125    216.875    224.875    232.9375    240.9375    249    256
0    4    10.0625    16.0625    23.0625    29.125    36.125    42.1875    50.1875    57.25    65.25    73.3125    80.3125    87.3125    94.375    101.375    109.4375    116.4375    123.5    131.5    140.5625    149.5625    158.625    166.625    173.6875    179.6875    185.75    192.75    200.8125    209.8125    218.875    228.875    237.9375
0    9.0625    19.0625    29.125    37.125    47.1875    56.25    65.25    74.3125    82.312590.375    98.375    106.4375    113.4375    120.5    128.5    137.5625    147.5625    156.625    164.625    171.6875    177.6875    183.6875    189.75    196.75    203.8125    211.8125    219.875    228.875    237.9375    245.9375252    256
0    7    14.0625    21.0625    29.125    36.125    43.1875    50.1875    58.25    65.25    72.3125    79.3125    87.3125    94.375    101.375    108.4375    116.4375    123.5    130.5    137.5625    145.5625    152.625    159.625    166.625    174.6875    181.6875    188.75    195.75    203.8125    210.8125    217.875    224.875    231.875



$ cat Hex.pl

use strict;
use warnings;

open(FHin,"<","111.txt") or die "$!";
open(FHout,">","gma.txt") or die "$!";

while(<FHin>){
  chomp;
  my @aOut = ();
  while(m/(\w\w)(\w\w)/g){
    push @aOut, hex("$2$1")/16;
  }
  print FHout join("\t",@aOut),"\n";
}
print "Output: gma.txt\n";
close;

评分

参与人数 1信誉积分 +50 收起 理由
Innocencer + 50 很给力!

查看全部评分

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2017-09-21 13:15 |显示全部楼层

  1. flw at waker in ~
  2. $ cat 1.txt
  3. 00008100010182010202820203038403040485040505860506068706070788070808890809098A090A0A8B0A0B0B8C0B0C0C8D0C0D0D8E0D0E0E8F0E0F0F900F0010
  4. 00004000A10001017101D2014202A302230394031404950405057505E6055606D7064707B8073808C9085909EA096A0ADB0A3B0B9C0B0C0C8D0C1D0DAE0D4E0EDF0E
  5. 000091003101D2015202F30284031404A5042505A6052606A70617078807080899083909CA094A0ABB0A1B0B7B0BDC0B4C0CBD0C3D0DBE0D4E0EDF0E5F0FC00F0010
  6. 00007000E1005101D2014202B3022303A40314048504F5047505E6055606C7064707B8072808990819098A09FA096A0AEB0A5B0BCC0B3C0CBD0C2D0D9E0D0E0E7E0E

  7. flw at waker in ~
  8. $ perl -lne 'print join " ", map { 1/16 * unpack "S4", pack "H4", $_ } unpack "(A4)*", $_' 1.txt
  9. 0 8.0625 16.0625 24.125 32.125 40.125 48.1875 56.25 64.25 72.3125 80.3125 88.375 96.375 104.4375 112.4375 120.5 128.5 136.5625 144.5625 152.625 160.625 168.6875 176.6875 184.75 192.75 200.8125 208.8125 216.875 224.875 232.9375 240.9375 249 256
  10. 0 4 10.0625 16.0625 23.0625 29.125 36.125 42.1875 50.1875 57.25 65.25 73.3125 80.3125 87.3125 94.375 101.375 109.4375 116.4375 123.5 131.5 140.5625 149.5625 158.625 166.625 173.6875 179.6875 185.75 192.75 200.8125 209.8125 218.875 228.875 237.9375
  11. 0 9.0625 19.0625 29.125 37.125 47.1875 56.25 65.25 74.3125 82.3125 90.375 98.375 106.4375 113.4375 120.5 128.5 137.5625 147.5625 156.625 164.625 171.6875 177.6875 183.6875 189.75 196.75 203.8125 211.8125 219.875 228.875 237.9375 245.9375 252 256
  12. 0 7 14.0625 21.0625 29.125 36.125 43.1875 50.1875 58.25 65.25 72.3125 79.3125 87.3125 94.375 101.375 108.4375 116.4375 123.5 130.5 137.5625 145.5625 152.625 159.625 166.625 174.6875 181.6875 188.75 195.75 203.8125 210.8125 217.875 224.875 231.875
复制代码

评分

参与人数 1信誉积分 +5 收起 理由
523066680 + 5 很给力!

查看全部评分

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-09-21 13:54 |显示全部楼层
本帖最后由 sunzhiguolu 于 2017-09-21 14:00 编辑

哪位大神帮我瞧瞧,为什么我的就不行呢?
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. $" = '';
  5. open(my $FHr, '<', 'z:\\f');
  6. my ($buf, @bufs);
  7. while(read($FHr, $buf, 2)){
  8.     next if(unshift(@bufs, $buf) % 2);
  9.     print(hex("@bufs") / 16, "\t");
  10.     @bufs = ();
  11. }
  12. close($FHr);
复制代码

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-09-21 13:57 |显示全部楼层
本帖最后由 sunzhiguolu 于 2017-09-21 13:59 编辑



楼上两位大神的都没有问题,为什么我的就报错?

论坛徽章:
10
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之山东
日期:2017-11-10 14:32:14
发表于 2017-09-21 15:32 |显示全部楼层
  1. my $s =
  2. "00008100010182010202820203038403040485040505860506068706070788070808890809098A090A0A8B0A0B0B8C0B0C0C8D0C0D0D8E0D0E0E8F0E0F0F900F0010".
  3. "00004000A10001017101D2014202A302230394031404950405057505E6055606D7064707B8073808C9085909EA096A0ADB0A3B0B9C0B0C0C8D0C1D0DAE0D4E0EDF0E".
  4. "000091003101D2015202F30284031404A5042505A6052606A70617078807080899083909CA094A0ABB0A1B0B7B0BDC0B4C0CBD0C3D0DBE0D4E0EDF0E5F0FC00F0010".
  5. "00007000E1005101D2014202B3022303A40314048504F5047505E6055606C7064707B8072808990819098A09FA096A0AEB0A5B0BCC0B3C0CBD0C2D0D9E0D0E0E7E0E";

  6. grep { $_=~s/(\w\w)(\w\w)/$2$1/; print hex($_)/16,"\t" } grep {$_} split /(.{4})/, $s;
复制代码

论坛徽章:
0
发表于 2017-09-21 15:40 |显示全部楼层
回复 2# jason680
谢谢大神,真是厉害~

论坛徽章:
120
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07巳蛇
日期:2014-05-09 16:43:18巨蟹座
日期:2014-10-23 17:48:38子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59
发表于 2017-09-21 16:09 |显示全部楼层
回复 5# sunzhiguolu

读到换行(0d 0a)

论坛徽章:
0
发表于 2017-09-21 16:55 |显示全部楼层
回复 3# flw
谢谢大师,我暂时看不太懂。我先琢磨琢磨。

论坛徽章:
0
发表于 2017-09-21 17:19 |显示全部楼层
回复 6# 523066680

谢谢大神。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP