Die IP-Adressen gespeichert als int-Ergebnisse im überlauf?
Ich Schreibe ein chat-server in node.js und ich will, speichern die angeschlossenen Benutzer IP-Adressen in einer mysql-Datenbank als (unsigned) Ganzzahlen.
Ich habe geschrieben eine javascript-Methode zum konvertieren einer ip-Adresse als string in eine Ganzzahl. Ich bekomme einige seltsame Ergebnisse jedoch.
Hier ist mein code:
function ipToInt(ip) {
var parts = ip.split(".");
var res = 0;
res += parseInt(parts[0], 10) << 24;
res += parseInt(parts[1], 10) << 16;
res += parseInt(parts[2], 10) << 8;
res += parseInt(parts[3], 10);
return res;
}
Wenn ich rufen Sie die Methode als ipToInt("192.168.2.44");
den Ergebnissen, die ich bekomme, ist -1062731220
.
Es scheint wie ein überlauf aufgetreten ist, das ist seltsam, weil die erwartete Ausgabe (3232236076)
im inneren ist die Zahl, die in javascript (2^52).
Wenn ich überprüfen -1062731220
in binärer form, ich kann sehen, dass die 3232236076
erhalten bleibt, aber gefüllt mit den führenden 1.
Ich bin mir nicht sicher, aber ich denke, dass das problem mit signed vs. unsigned Integer.
Können Sie sich erklären, was Los ist?
Und möglicherweise, wie zu analysieren -1062731220
wieder zu einem string ip?
InformationsquelleAutor der Frage JPuge | 2011-11-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum ist der umgewandelten IP-negative?
Es NICHT zu einem überlauf. Der erste Teil der IP-Adresse 192 wandelt, 11000000 in Binär. Sie dann, dass die Schicht den ganzen Weg auf der linken Seite. Wenn es eine 1 in die linke position eines 32-bit-Zahl, es ist negativ.
Wie wollen Sie konvertieren wieder zu einem string?
Tun die gleiche Sache, die Sie getan haben, um die Konvertierung von string, aber in umgekehrter Richtung. Verschiebung nach rechts (und Maske)!
Warum das Rad neu erfinden? Aus Google:
ODER Sie verwenden können, welche ich hier gefunden:
http://javascript.about.com/library/blipconvert.htm
InformationsquelleAutor der Antwort evan
Das Ergebnis von "<<" - operator ist immer eine signierte 32-bit-Ganzzahl, als pro spec.
Wenn Sie die Verschiebung zurück, verwenden Sie ">>>", um eine vorzeichenlose rechts-shift.
InformationsquelleAutor der Antwort Pointy
Vielleicht finden Sie auch dieses nützliche Muster:
Wenn Sie mit so etwas wie node.js wo können Sie Funktionen hinzufügen, die durch so etwas wie Npm, dann können Sie einfach tun:
Zu bekommen, dass die Funktionalität von der Quelle, die hier aus:
https://github.com/indutny/node-ip/blob/master/lib/ip.js
Erhalten Sie auch eine Reihe von anderen IP utility-Funktionen mit.
InformationsquelleAutor der Antwort Guy
Du nach Links verschoben, um die ursprüngliche Zahl, die nur 4 Sätze von bits unabhängig vom Vorzeichen.
Verschiebung nach rechts, um wieder zu der IP. Egal, was das Zeichen ist.
InformationsquelleAutor der Antwort Mike
IP-Adressen in der V4 Platz sind vorzeichenlose 32 bit-zahlen, also die IP-Adresse des FF.FF.FF.FF ist 2^32 sein und nicht größer als diese Zahl. Siehe:
Diese stack-überlauf Artikel über das gleiche Thema
Zu drehen, dass die Nummer wieder in eine IP-Adresse müssen Sie brechen die Reihe nach unten, in seine 4 Teile, da jedes byte ist ein Oktett von der Adresse, damit konvertieren Sie die Zahl in hex und dann analysieren jedes paar. Sie können oder möglicherweise nicht haben, um eine führende null für das erste Oktett.
Zusätzlich kann zu tun haben, die mit byte-Reihenfolge von integer ( endien Probleme ), aber da die meisten Systeme sind intel-basierte in diesen Tagen, die Sie vielleicht nicht haben, um damit umzugehen.
InformationsquelleAutor der Antwort FlyingGuy
InformationsquelleAutor der Antwort user2321638
Überarbeitete ich Evan ' s Letzte Antwort ein wenig, besonders dot2num. Es hat die gleiche Funktion könnte aber besser lesbar und ist geringfügig langsamer.
InformationsquelleAutor der Antwort George Crowson
Versuchen, diese Lösung, es könnte helfen:
InformationsquelleAutor der Antwort TCK
Entnommen repo
InformationsquelleAutor der Antwort Davit Tvildiani