3

9766322441私の10進数が対応していると仮定70.30.65.9しますが、このIPアドレスICを逆に変換すると、別の10進数が得られ1176387849ます...そしてIPアドレスpf google.comを変換する64.233.187.991089059683、逆変換すると正しいIPが得られますアドレスすなわち64.233.187.99..。

私の質問は、上記の番号の何が問題になっているのですか?私も試してみまし9579342332たが、同じ結果です。それは間違った逆変換を与えますか?

その背後にある理由は何ですか?

この計算機を計算に使用できます。

4

7 に答える 7

19

値が正しくありません。70.30.65.9は1176387849に対応しますが、9766322441には対応しません。

32ビットの制限-Java :d​​ecを32ビットintに変換する方法は?

IPを10進数に変換するC++の例:

#include <iostream.h>

main()
{
    // Initialize the variables
    unsigned long a,b,c,d,base10IP;

    // Get the IP address from user
    cout << "\nEnter an IP address in dotted quad notation (x.x.x.x)";
    cout << "\nwith each section seperated by a space: ";
    cin >> a >> b >> c >> d;

    // Do calculations to convert IP to base 10
    a *= 16777216;
    b *= 65536;
    c *= 256;
    base10IP = a + b + c + d;

    // Output new IP address
    cout << "\nThe converted address is: " << base10IP << '\n';
   }

これは、IPを10進数に変換するJAVAクラスです:-
/**
 * @author Charles Johnson
 * from http://www.technojeeves.com/joomla/index.php/free/58-convert-ip-address-to-number
*/
public class IpConverter {
  public static void main(String[] args) {
    System.out.println(longToIp(Long.valueOf(args[0], 16)));
  }

  public static String toHex(String ipAddress) {
    return Long.toHexString(IpConverter.ipToLong(ipAddress));
  }

  public static long ipToLong(String ipAddress) {
    long result = 0;
    String[] atoms = ipAddress.split("\\.");

    for (int i = 3; i >= 0; i--) {
        result |= (Long.parseLong(atoms[3 - i]) << (i * 8));
    }

    return result & 0xFFFFFFFF;
  }

  public static String longToIp(long ip) {
    StringBuilder sb = new StringBuilder(15);

    for (int i = 0; i < 4; i++) {
        sb.insert(0, Long.toString(ip & 0xff));

        if (i < 3) {
            sb.insert(0, '.');
        }

        ip >>= 8;
    }

    return sb.toString();
  }
}

IPを10進数に変換する別のJAVAの例:-String ip = "70.30.65.9"; String [] addrArray = ip.split( "\。"); long num = 0; for(int i = 0; i IPを10進数に変換するPHP関数:-function myip2long($ ip){if(is_numeric($ ip)){return sprintf( "%u"、floatval($ ip));} else {return sprintf( "%u"、floatval(ip2long($ ip)));}}適用してみてください。例:echo myip2long( "192.168.1.1");
IPを10進数に変換するPHPの別の例:-function myip2long2 ($ ip){$ d = 0.0; $ b = explode( "。"、$ ip、4); for($ i = 0; $ i 10進数をIPに変換するPHPの例:-function customLong2ip($ ip){ $ b = array(0,0,0,0); $ c = 16777216.0; $ ip +=0。 0; for($ i = 0; $ i
于 2012-08-26T13:29:33.090 に答える
3

10 進数値 9766322441 で有効な IPV4 範囲を超えています。

02, 46, 1e, 41, 09

計算機は単にオクテットを値 0x02 で切り捨て、最下位 4 オクテットを使用して値を変換します。

0x461E4109 の計算により、計算機によって表示される「70.30.65.9」が得られます。


Java でこれを行う方法:

InetAddress の操作には、標準の Java クラスを使用することをお勧めします。これは、IPV4 と IPv6 の両方で機能するはずです: http://docs.oracle.com/javase/1.5.0/docs/api/java/net/InetAddress.html

あなたは次のようなものを見ているかもしれません(私は10年以上前にJavaを使用していたので、構文エラーを見つけたら自由に修正してください)

InetAddress Address = InetAddress.getByName("192.168.0.1");
InetAddress Address = InetAddress.getByName(raw2);
String s1 = Address.toString();
byte[] raw = Adress.getAddress();

byte[] rawIPv4 = {192, 168, 0, 1};
InetAddress Address1 = InetAddress.getByName(rawIPV4);

InetAddress Address2 = InetAddress.getByName("2607:f0d0:1002:51::4");
byte[] rawIPV6 = Adress.getAddress();

IPv6 の例では、アドレスの「圧縮されたゼロ」(51 と 4 の間の「::」) のケースもカバーしています。

とにかく、バイト配列を整数に変換するためにこれを確認することをお勧めします:
Byte Array and Int conversion in Java

ただし、IPV6 形式では 1 つの IP アドレスに 16 バイトが使用されるため、計算機に示されているように 1 つの整数値で表現できるかどうかはわかりません.

于 2012-08-26T13:42:45.150 に答える
2

IPv4 アドレスは 32 ビットです。

数値9,766,322,441を 32 ビット (最大: ) で表すことはできません4,294,967,295

于 2012-08-26T13:46:51.107 に答える
1

元の投稿と、人々の回答に対するその後のフォローアップの投稿を読むと、元の「10 桁の 10 進数」は、実際には何らかの方法で IP アドレスに変換したい電話番号であるという明確な印象を受けます。

「モバイルから IP へ、またはその逆の変換アルゴリズムを開発したいから」

そのようには機能しません。これは、MAC アドレスを取得して IP アドレスに変換する方法を尋ねるようなものです。電話番号と IP アドレスは、2 つのまったく異なる機関によって割り当てられます。この 2 つを関連付けるアルゴリズムはありません。

于 2014-11-10T20:18:16.940 に答える
0

実際には、IP アドレスは 32 ビットの Java 整数に変換できますが、数値が負になる可能性があります。データを失うことなく前後に変換できるため、これは本当に問題ありません。余分な 32 ビットを本当に使用して long に格納したい場合は、Java にネガティブに見えないようにすることができますが、無駄です。long にキャストして unsigned で表示するが、int に格納する関数を作成できます。

于 2013-06-13T15:41:40.087 に答える