Perl - raw bytes via udp

Gast #4004338
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.