免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
论坛 程序设计 Perl 求助
最近访问板块 发新帖
查看: 5990 | 回复: 5
打印 上一主题 下一主题

求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-05-31 20:34 |只看该作者 |倒序浏览
现在有rgb_o.txt:

00000000
00000000
00000000
00000401
00100401
00100401
00100802
00200802
00200802
00200c03
00300c03
00300c03
00301004
00401004
00401004
00401405
00501405
00501405
00501806
00601806
00601806
00601c07
00701c07
00701c07
00702008
00802008
00802008
00802409
00902409
00902409
共1080行。

把rgb_o.txt的数据当做16进制,转成2进制。然后每十位再当做一个二进制数,则每行会有3个十位的二进制数。不够位数前面补0
以我例子的最后一行为例。HEX:00902409 ==》BIN:0000001001 0000001001 0000001001
然后再将二进制转为十进制,则每行依次为9 9 9,共1080行。(或者每行一个整数,共3240行也可以。)

这时每行都会有三个10进制整数。
这部分我用perl实现了,虽然代码很丑。

再之后,我想降得到的每行三个数,变为每行四个数,即N行的三个加上N+1行的第一个,;N+1行后两个加上N+2行前两个。依次顺序。得到共810行,每行四位的数。
格式如下。
这里我用matlab矩阵变换得到的。我现在想用简单易懂的perl语言全部实现。请教大神们,谢谢!。

B = reshape(A,4,810);
B =B';

0        0        0        0
0        0        0        0
0        0        1        1
1        1        1        1
1        1        1        2
2        2        2        2
2        2        2        2
3        3        3        3
3        3        3        3
3        4        4        4
4        4        4        4
4        4        5        5
5        5        5        5
5        5        5        6
6        6        6        6
6        6        6        6
7        7        7        7
7        7        7        7
7        8        8        8
8        8        8        8
8        8        9        9
9        9        9        9


论坛徽章:
0
2 [报告]
发表于 2018-06-01 11:54 |只看该作者
#!c/perl/bin/perl
use utf8;
my $file_txt1 = "E:/perl/1.txt";        ##处理前文本
my $file_txt2 = "E:/perl/2.txt";        ##处理后文本
my $j = 0;
open(STAT, $file_txt1) or die "can't open file $file_txt1: $!";
while(<STAT>)
{
        my $num = sprintf ("%b", hex $_);                ##先转10进制 再转2进制
        while(length($num) < 30) { $num = "0$num"; }        ##不足30位补0
        for ( $i = 0; $i < 3; $i++ ) {                       
                $j += 1;
                if ( open(SESAME,">>$file_txt2") or die("$!")) {
                        $num4 = oct( '0b' . substr($num,$i*10,10) );                ##分别取前、中、后十位2进制转为10进制
                        if ( $j != 4 ) { print SESAME "$num4 "; }                        ##输出到文件
                        else {
                                print SESAME "$num4 \n";                                                ##每四个换行
                                $j = 0;
                        }
                }
                close (SESAME);       
        }
}

测试ok   矩阵转换不会(大神看帖指请教一下perl矩阵转换) 我用语法排为4列的  加了注解希望你能看懂
另外你的8位16进制数  最大可以有32位二进制数而不是30位  这里程序按30位处理

论坛徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期: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联赛之北京
日期:2019-08-13 17:30:53
3 [报告]
发表于 2018-06-01 20:05 |只看该作者
  1. use File::Slurp;
  2. my @arr;
  3. my @data = read_file("rgb_o.txt");

  4. grep {
  5.     $_=~s/\r?\n$//;
  6.     get_num( \@arr, $_ );
  7. } @data;

  8. while ( $#arr >= 0 ) { print join(",", splice @arr, 0, 4), "\n"; }

  9. sub get_num
  10. {
  11.     my ($ref, $s) = @_;
  12.     my $bin = sprintf "%030b", hex($s);  #补足0
  13.     my @e = ( $bin=~/\d{10}/g );
  14.     grep { $_ = oct( "0b". $_ ) } @e;
  15.     push @$ref, @e;
  16. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2018-06-04 10:17 |只看该作者
回复 2# 唐胜

谢谢您,亲测可行。注释赞。

论坛徽章:
0
5 [报告]
发表于 2018-06-04 10:19 |只看该作者
回复 3# 523066680

谢谢您。以前有一次发帖也是您帮了我。

论坛徽章:
0
6 [报告]
发表于 2018-06-05 11:12 |只看该作者
回复 2# 唐胜

8进制数这里最大值3FF,所以二进制最大就是1111111111,还是十位。所以不会大于十位,这里忘了说明。谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP