Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use Data::Dump;
- use experimental :pack;
- my $socket = IO::Socket::Async.listen('0.0.0.0', 7000);
- react {
- whenever $socket -> $conn {
- my $line = '';
- whenever $conn {
- say "Received --> "~$_;
- $conn.print: &translate($_) if $_.chars ge 100;
- $conn.close;
- }
- }
- CATCH {
- default {
- say .^name, ': ', .Str;
- say "handled in $?LINE";
- }
- }
- }
- sub translate($raw) {
- my $rawdata = $raw;
- $raw ~~ s/^\s+|\s+$//; # remove heading/trailing whitespace
- my $minus_checksum = substr($raw, 0, *-2);
- my $our_checksum = generateChecksum($minus_checksum);
- my $data_checksum = ($raw, *-2);
- # say $our_checksum;
- return $our_checksum;
- }
- sub generateChecksum($minus_checksum) {
- # turn string into Blob
- my Blob $blob = $minus_checksum.encode('utf-8');
- # unpack Blob into ascii list
- my @array = $blob.unpack("C*");
- # perform bitwise operation for each ascii in the list
- my $dec +^= $_ for $blob.unpack("C*");
- # only take 2 digits
- $dec = sprintf("%02d", $dec) if $dec ~~ /^\d$/;
- $dec = '0'.$dec if $dec ~~ /^[a..fA..F]$/;
- $dec = uc $dec;
- # convert it to hex
- my $hex = sprintf '%02x', $dec;
- return uc $hex;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement