我需要获得这个Perl代码中使用的算法,但我对Perl一无所知。通常这不是问题,因为我会研究这种语言,但这种正则表达式的东西已经超出了我的想法!
有人可以伪代码吗?我只需要知道发生了什么,所以我可以用其他东西来实现它,最好是PHP甚至是C ++,但我会担心那部分。我只需要以某种方式解读这是在做什么:
$a = $ARGV[0];
$a =~ s/[^A-F0-9]+//simg;
@b = reverse split /(\S{2})/,$a;
$c = join "", @b;
$c .= "0000";
$d = hex($c) % 999999929;
print "$d\n";
答案 0 :(得分:10)
关于它的文章写得不好?它可以使用更好的var名称,但我不知道是否可能(因为中间步骤似乎没有任何可命名的质量),只留下split
的不当使用。伪代码几乎就是单词翻译的单词。
$a = $ARGV[0];
$a =~ s/[^A-F0-9]+//simg;
@b = reverse split /(\S{2})/,$a;
$c = join "", @b;
$c .= "0000";
$d = hex($c) % 999999929;
print "$d\n";
应该是
$a = $ARGV[0]; # Get a hex str from cmd line E3:C9:D4
$a =~ s/[^A-F0-9]+//simg; # Remove any non-hex digits E3C9D4
@b = reverse $a =~ /(..)/sg; # Extract "bytes"; reverse D4, C9, E3
$c = join "", @b; # Join them. D4C9E3
$c .= "0000"; # Append two NULs D4C9E30000
$d = hex($c) % 999999929; # Convert from hex to number and modulus
print "$d\n"; # Print the result (in decimal).
稍微清楚一点:
$a = $ARGV[0];
$a =~ s/[^0-9A-Fa-f]+//g;
$a = join '', reverse $a =~ /(..)/sg;
$a .= "0000";
$a = hex($a);
$a %= 999999929;
print "$a\n";
这些代码段可能存在错误。在具有32位整数的Perl上,如果输入具有多于四个十六进制数字,hex
将溢出。具有64位整数的Perl将处理12个十六进制数字。
您似乎已从here获取代码。这意味着将MAC地址作为输入,这意味着代码需要64位整数或Math::BigInt才能工作。由于你想模拟一个64位的值,所以没有办法解决它。
这是一个简洁的方法,只适用于具有64位整数的Perls:
my $mac = $ARGV[0];
$mac =~ s/[^0-9A-Fa-f]+//g;
die length($mac) != 12;
# "123456789ABC" => 0xBC9A785634120000
my $hash = unpack('Q<', pack('H*', "0000$mac"));
$hash %= 999999929;
print "$hash\n";
为了便于携带,最好将Math :: BigInt集成到早期版本中。
答案 1 :(得分:2)
它正在寻找以十六进制连接在一起的一串八位字节作为程序的第一个参数,并应用模数。
因此,如果程序被调用为:
$ myprog.pl A0B0
然后$c
中的值将为B0A00000
。因此,$d
的值应为0x396A6C8E
。
答案 2 :(得分:2)
$a = $ARGV[0]; # assign first command line arg to $a
$a =~ s/[^A-F0-9]+//simg; # delete non-hex from $a
@b = reverse split /(\S{2})/,$a; # split $a by 2 non-whitespace (saving them too) to array @b and reverse it
$c = join "", @b; # join array @b to scalar $c
$c .= "0000"; # append 4 zeros to $c
$d = hex($c) % 999999929; # get modulo
print "$d\n"; # print it
答案 3 :(得分:1)
$a = $ARGV[0]; #Read in the first argument on the command line
$a =~ s/[^A-F0-9]+//simg; #Substitute non hex numbers with nothing *
@b = reverse split /(\S{2})/,$a; #What is left in $a, split by 2 non-space characters
$c = join "", @b; # put the array b into $c
$c .= "0000";
$d = hex($c) % 999999929; #Convert $c to an integer and % with 999999929
print "$d\n";
简而言之,我们正在剥离第一个十六进制数,然后反转字节顺序(一次2个十六进制数)并对结果进行模数计算。