Perl - raw bytes via udp

Gast #4004338
Lesenswert?
• ▲
▼
Hallo,

in einem Perl Script sollen UDP frames erzeugt bzw. gesendet werden, 
welche XY Koordinaten und Farbwerte RGB ( je ein byte) enthalten.

Angenommen der Server erzeugt folgende Werte für einen "Pixel"

X-Koordinate= Pixel 8   (HEX:08)
Y-Koordinate= Pixel 2   (HEX:02)

(Farbe:violett)
Rotwert=  160   (HEX:A0)
Grünwert= 32    (HEX:20)
Blauwert= 240   (HEX:F0)

Nnun sollen die Daten exakt wie folgt formatiert - versendet werden
"0802A020F0"

Hierfür habe ich folgendes Perl-Script geschrieben.
1
#!/usr/bin/perl
2

3
use strict;
4
use warnings;
5

6
use IO::Socket;
7
my $xval=00;
8
my $yval=00;
9
my $rval=00;
10
my $gval=00;
11
my $bval=00;
12

13

14
my $bulb_sock = IO::Socket::INET->new(
15
    Proto    => 'udp',
16
    PeerPort => 8888,
17
    PeerAddr => '192.168.3.23',
18
) or die "Could not create socket: $!\n";
19
for( ; ; )
20
{
21

22

23
#Generate Random XY Coordinates within possible range and convert to HEX
24
$xval = int(rand(9));   $xval = sprintf("%02x",$xval);
25
$yval = int(rand(23));  $yval = sprintf("%02x",$yval);
26

27
#Generate Random RGB Values within possible range for additive color mixing and convert to HEX
28
$rval = int(rand(255)); $rval = sprintf("%02x",$rval);
29
$gval = int(rand(255)); $gval = sprintf("%02x",$gval);
30
$bval = int(rand(255)); $bval = sprintf("%02x",$bval);
31

32
#send data via UDP
33
$bulb_sock->send("$xval"."$yval"."$rval"."$gval"."$bval") or die "Send Error: $!\n";
34
}

Anders als erartet, sendet dieses jedoch für oben genannte XYZRGB Werte:
"30383032613032306630"
und nicht:
"0802A020F0"


Wo ist das Problem ?
Danke !
Gast #4004387
Lesenswert?
• ▲
▼
Peter II schrieb:
> nachtrag:
>
> "%02x",
>
> das erzeugt du ja extra Text.
>

Stimmt.  Das sprintf Text erzeugt und nicht meine HEX Werte erklärt 
dieses verhalten. Das hatte ich so nicht bedacht. Allerdings "benötige" 
ich sprintf um die integer werte in HEX zu konvertieren.

Kann ich mit sprintf HEX anstatt ASCII ausgeben ? ?
Gast #4004411
Lesenswert?
• ▲
▼
nachtrag:
1
$bulb_sock->send("\x08\x02\xA0\x20\xF0") or die "Send Error: $!\n";
funktioniert.
1
$bulb_sock->send("\x$xval"."\x$yval"."\x$rval"."\x$gval"."\x$bval") or die "Send Error: $!\n";
hingegen nicht und bringt mir
1
Illegal hexadecimal digit '$' ignored at ledtest.pl line 27.
Gast #4004427
Lesenswert?
• ▲
▼
Was wäre denn eine "einfache" lösung für diese Aufgabenstellung?

natürlich könnte man jetzt mit C anstatt mit Perl an die Sache 
herangehen. Das wäre aber mit ner Schrotflinte auf Spatzen geschossen 
...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren