Schrift
[thread]1546[/thread]

LONG nach bitstring: pack und unpack

Leser: 2


<< |< 1 2 >| >> 15 Einträge, 2 Seiten
esskar
 2004-05-12 23:22
#14919 #14919
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
ich würde gerne eine Zahl in ihre Bitfolge zerlegen:

Code: (dl )
print unpack("b*", pack("L", 3)); # 11000000000000000000000000000000


ich hätte es gerne genau umgekehrt:

also

00000000000000000000000000000011

nur wie?
ptk
 2004-05-13 13:38
#14920 #14920
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
reverse() aufrufen?
Taulmarill
 2004-05-13 14:00
#14921 #14921
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
versuch mal
Code: (dl )
print unpack("B*", pack("L", 3));


perldoc -f pack:

b A bit string (ascending bit order inside each byte, like vec()).
B A bit string (descending bit order inside each byte).
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Marcus
 2004-05-13 14:12
#14922 #14922
User since
2004-05-03
18 Artikel
BenutzerIn
[default_avatar]
Hallo,

B reicht noch nicht (die Bytes stehen in der "verkehrten" Reihenfolge) ich hab es dann mal so versucht:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl

use strict;
use warnings;

sub bitstring {
  return undef unless $_[0] =~ /^\d*$/;
  my $bstr = unpack("B*", pack("L",$_[0]));
  sprintf ( "%s%s%s%s", substr($bstr, 24, 8),
                        substr($bstr, 16, 8),
                        substr($bstr, 8, 8),
                        substr($bstr, 0, 8));
}
print "21098765432109876543210987654321\n";
print bitstring(3)."\n";
print bitstring(254)."\n";
print bitstring(255)."\n";
print bitstring(256)."\n";
print bitstring(65534)."\n";
print bitstring(65535)."\n";
print bitstring(65536)."\n";


Gruß Marcus
ronald
 2004-05-13 14:20
#14923 #14923
User since
2003-08-15
76 Artikel
BenutzerIn
[default_avatar]
wenn's nur noch darum geht, das Ergebnis anders auszugeben:

Code: (dl )
1
2
3
4
5
6
7
8
# zeichenweise
my $x = "abCDe";
my $y = join('', reverse split //, $x);
print "zeichenweise: $y\n";

# blockweise
$y = join('', reverse split /(..)/, $x); # verbesserungsfähig
print "blockweise: $y\n";
renee
 2004-05-13 14:32
#14924 #14924
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Bei Skalaren brauchst Du nicht erst zu splitten, da reicht einfach ein reverse:
Code: (dl )
1
2
3
$var = 'ERST'; 
$z = reverse($var);
print $z; # Ausgabe: TRSE
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
ronald
 2004-05-13 14:57
#14925 #14925
User since
2003-08-15
76 Artikel
BenutzerIn
[default_avatar]
@renee
Danke. Man braucht manche Funktionen halt so selten...
steinwolf
 2004-05-13 16:36
#14926 #14926
User since
2003-08-04
367 Artikel
BenutzerIn
[default_avatar]
gibt join() nicht immer eine liste, sprich ein array zurück??
$skalar = join() <-geht doch garnich
"Did you know? You can use your old motor oil to fertilize your lawn." - Blinkster - Professionelles EDV Forum
ptk
 2004-05-13 17:07
#14927 #14927
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=steinwolf,13.May.2004, 14:36]gibt join() nicht immer eine liste, sprich ein array zurück??[/quote]
Nein.
Crian
 2004-05-13 18:17
#14928 #14928
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
... ist doch gerade dazu da, eine Liste mit Füllstoff aneinander zu kleben
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2004-05-12 23:22.