hi,
L unsigned long (always 32 bit, machine byte order) N unsigned long (always 32 bit, big endian byte order) V unsigned long (always 32 bit, little endian byte order)
Du wirst mir hoffentlich nicht einzureden versuchen, dass das drei Typen sind. Das sind lediglich drei Formatierungen/Kodierungen für denselben Typ.
Steht doch da was das für Typen sind.
Die Schablonen implementieren diese Datentypen damit sie transportiert werden können. Und selbstverständlich haben mit N oder V erzeugte Binaries jeweils eine dem Datentyp entsprechende Länge, nämlich 32 Bit (4 Bytes).
Über die Schablone kann man die einzelnen Oktettenwertigkeiten bestimmen:
print unpack "CCCC", pack "N", 0xFFFFffff;
# 255 255 255 255
Und genauso werden IPv4 Adressen umgerechnet, das N steht für Networkorder. Hinsichtlich Byteorter muss man beachten, daß die ggf. von der Architektur vorgegeben ist. Auf jeden Fall jedoch kann man zwischen High/Low Order umrechnen.
Was Zeichenkodierung betrifft: Die Binary eines ASCII Zeichen ist ein primitiver Datentyp, ein vorzeichenloser 8 Bit Integer mit einer Länge von einem Byte.
UTF-8-Zeichen sind aus diesem Datentyp zusammengesetzte (abstrakte) Datentypen, wobei das erste Byte bstimmt, wieviele Bytes insgesamt zum jeweiligen Zeichen gehören.
Wenn die Oktettenwertigkeit des 1. Byte zB. zwischen 239 und 248 liegt sind für dieses Zeichen genau 4 Bytes zu lesen. Das muss z.B. jeder Texteditor machen damit er das Zeichen darstellen kann.
Man kann feststellen, daß jede Architektur die mit Zeichen arbeitet, mindestens den Datentyp eines vorzeichenlosen 8 Bit Integer kennen muss.
Und noch was praktisches, was den Zusammenhang zwischen Typisierung und Transport anschaulich macht:
Zeitserver nach RFC 868 liefern die genaue Uhrzeit als Anzahl der seit 1900 verstrichenen Sekunden. Die an einen Zeitserver gerichtete Anfrage liefert einen 32 Bit numerischen Datentyp in Network-Order (Big Endian), zu lesen sind also genau 4 Bytes. Untenstehender Code nimmt diese Zahl als Anzahl der Sekunden und rechnet diese auf Lokalzeit um:
my $socket = IO::Socket::INET->new("ptbtime2.ptb.de:37") or die $@;
read($socket, my $buffer, 4);
# 2208988800 Differenz in Sekunden 1.1.1900 1.1.1970
print scalar localtime unpack("N", $buffer) - 2208988800;
# Sun Mar 25 16:38:36 2018
MfG