Thread C Funktion in perl umsetzen (16 answers)
Opened by piet at 2015-02-11 13:03

rosti
 2015-02-11 16:54
#179600 #179600
User since
2011-03-19
3470 Artikel
BenutzerIn
[Homepage]
user image
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
use integer;

my @uha = qw(1 2 3 4 2 4 6 0 12); # Uint8 Array

say normalChecksum(@uha, scalar @uha); # 33
say simpleChecksum(@uha);              # 33

# von c nach Perl
sub normalChecksum{
    my $n = pop @_;
    my ($i,$a,$bb);
    for($i = 1, $a = 0; $i < $n; $i++){
        $a += $_[$i];
    }
    
    $bb = $a / 255;
    $a = ($a - 256 * $bb) + $bb;
    $bb = $a / 256;

    return ($a-256*$bb) + $bb;
}

# Vereinfachung mit pack
sub simpleChecksum{
    my @uha = @_;
    return unpack("%C*", pack "C*", @uha) - 1;
}


PS: Mein gcc kennt uint8 nicht, ich habe deswegen int verwendet und das für Dich mal getestet:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>

// 1 2 3 4 2 4 6 0 12

int main(void){
int b[] = {1, 2, 3, 4, 2, 4, 6, 0, 12};
printf("%u\n", normalChecksum(b, 9));
return 0;
}


int normalChecksum(int *b, int n){
int i;
int a, bb;

for(i = 1, a = 0; i < n; i++)
a+=(int)b[i];

bb = a / 256;
a = (a - 256 * bb) + bb;
bb = a / 256;

return (int)((a-256*bb)+bb);
}


Das Ergebnis ist, wie mit obenstehenden Perl-Code und den Beispielzahlen => 33
Die Zahlen in der Liste werden einfach nur aufsummiert und zum Schluss wird 1 abgezogen. Am Einfachsten ist diese Art der Checksummenerzeugung mit pack/unpack.
Last edited: 2015-02-12 08:22:24 +0100 (CET)

View full thread C Funktion in perl umsetzen