Konvertierung/Dekonvertierung int8 / int16 / int32 / int64 von/zu einer Dezimalzahl
am 11.10.2006 10:35:59 von mgloss
Hallo Liste,
ich versuche gerade eine Oberfläche für mldonkey zu basteln und da
das
GUI-Protokoll zu verwenden.
(http://mldonkey.sourceforge.net/GuiProtocol)
Allerdings grübele ich gerade, wie man little-Endian Integers ohne
Vorzeichen in/von Dezimalzahlen umwandelt (bzw. zurückwandelt).
Für int16 und int32 funktioniert pack/unpack mit dem Formatstring v
bzw. V.
Für int8 und int64 habe ich leider bisher noch nichts gefunden. Hat
einer von euch da einen guten Tipp für mich?
Viele Grüße, Mathias
Re: Konvertierung/Dekonvertierung int8 / int16 / int32 / int64 von/zueiner Dezimalzahl
am 11.10.2006 18:21:47 von dafox
mgloss@gmail.com schrieb:
> ich versuche gerade eine Oberfläche für mldonkey zu basteln und da
> das GUI-Protokoll zu verwenden.
> (http://mldonkey.sourceforge.net/GuiProtocol)
Mit PHP? Ne, ist klar.
> Allerdings grübele ich gerade, wie man little-Endian Integers ohne
> Vorzeichen in/von Dezimalzahlen umwandelt (bzw. zurückwandelt).
> Für int8 und int64 habe ich leider bisher noch nichts gefunden. Hat
> einer von euch da einen guten Tipp für mich?
8 Bit = 1 Char. pack() mit c bzw. C sollte da helfen. Den 64Bit-Int
kannst du in PHP nur als Float darstellen, da PHP keine 64-Bit-Ints
unterstützt.
$a = 2147483647;
$b = 2147483648;
var_dump($a); // int(2147483647)
var_dump($b); // float(2147483648)
?>
Du kannst hier aber vielleicht zwei 32-Bit-Integers lesen und diese dann
in einen Float umwandeln.
function bigInt2float($upper, $lower) {
return $upper * (0x7fffffff + 1) + $lower;
}
Re: Konvertierung/Dekonvertierung int8 / int16 / int32 / int64 von/zu einer Dezimalzahl
am 12.10.2006 09:43:50 von mgloss
Hallo Thomas,
Thomas 'DaFox' Hamacher wrote:
> > ich versuche gerade eine Oberfläche für mldonkey zu basteln und da
> > das GUI-Protokoll zu verwenden.
> > (http://mldonkey.sourceforge.net/GuiProtocol)
>
> Mit PHP? Ne, ist klar.
Hätte ich noch dazu schreiben können, aber ich dachte, das ergibt
sich
ja schon aus dem Newsgruppennamen :)
> > Für int8 und int64 habe ich leider bisher noch nichts gefunden. Hat
> > einer von euch da einen guten Tipp für mich?
>
> 8 Bit =3D 1 Char. pack() mit c bzw. C sollte da helfen. Den 64Bit-Int
> kannst du in PHP nur als Float darstellen, da PHP keine 64-Bit-Ints
> unterstützt.
*argel*, das habe ich ganz in der Doku überlesen... wer kommt denn
schon drauf daß Char (C) das gleiche wie ein int8 ist ;-)
>
> $a =3D 2147483647;
> $b =3D 2147483648;
>
> var_dump($a); // int(2147483647)
> var_dump($b); // float(2147483648)
> ?>
>
> Du kannst hier aber vielleicht zwei 32-Bit-Integers lesen und diese dann
> in einen Float umwandeln.
>
> function bigInt2float($upper, $lower) {
> return $upper * (0x7fffffff + 1) + $lower;
> }
ich habe das jetzt so ähnlich gelöst (aus verschiedenen Gründen kann
der
Input auch leer sein; die ints sind alle unsigned):
function _DecodeInt64($sIn){
if ( $sIn <> '' ) {
for ($i =3D 0; $i <=3D 7; $i++) {
$sVal =3D $this->_DecodeInt8(substr($sIn,$i,1));
$sSum +=3D $sVal * pow(256,$i);
}
return($sSum);
} else {
return('');
}
}
function _DecodeInt8($sIn){
return(ord($sIn)); # seems to work
# if ( $sIn <> '' ) { # works also
# $d =3D unpack("Cz", $sIn);
# } else {
# $d['z'] =3D '';
# }=20
# return($d['z']);
}
Vielen Dank und Grüße,
Mathias