有人可以为我翻译这个写得很糟糕的Perl代码吗?

arm*_*ani 3 perl

我需要获得这个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";
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 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";
Run Code Online (Sandbox Code Playgroud)

应该

$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).
Run Code Online (Sandbox Code Playgroud)

稍微清楚一点:

$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";
Run Code Online (Sandbox Code Playgroud)

这些片段中可能存在错误.在具有32位整数的Perl上,hex如果输入具有多于四个十六进制数字,则会溢出.具有64位整数的Perl将处理12个十六进制数字.


你好像从这里拿了代码.这意味着将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";
Run Code Online (Sandbox Code Playgroud)

为了便于携带,最好将Math :: BigInt集成到早期版本中.