2017-11-17 55 views
2

IPv6アドレスをバイナリ文字列に変換するにはどうすればよいですか?IPv6アドレスをバイナリ文字列に変換するにはどうすればよいですか?

例:

IPv6: 2001:0db8:85a3:0000:0000:8a2e:0370:7334 
Binary: 0010000000000001 0000110110111000 1000010110100011 0000000000000000 0000000000000000 1000101000101110 0000001101110000 0111001100110100 

私はJavaでこれをやりたいです。

C++で実装され、私はもっとよく知って:

#include <iostream> 
#include <string> 

#define _BSD_SOURCE 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 

std::string toBinary(unsigned long int decimalIpV6) 
{ 
    std::string r; 
    while(decimalIpV6!=0) {r=(decimalIpV6%2==0 ?"0":"1")+r; decimalIpV6/=2;} 
    return r; 
} 

unsigned long int ipV6toDecimal(std::string binaryString) { 
    struct sockaddr_in antelope;  
    inet_aton(binaryString.c_str(), &antelope.sin_addr); // store IP in antelope 
    // and this call is the same as the inet_aton() call, above: 
    antelope.sin_addr.s_addr = inet_addr(binaryString.c_str()); 
    return antelope.sin_addr.s_addr; 
} 

int main() { 
    std::string ipv6 = "192.168.0.0"; 
    unsigned long int ipv6decimal= ipV6toDecimal(ipv6); 
    std::cout << toBinary(ipv6decimal) << std::endl; 
    return 0; 
} 

バグがあると(間違った結果を生成するここに私の失敗した試みである(私は全くこの試みに関連するソリューションを要求しません) "1010100011000000")。


PS:IPv6をテストするときにあなたを助けるかもしれないバイナリ電卓onlineにあります。

+0

'私はJavaでこれをやりたいここに私の失敗した試行 '...うーん... – Henrik

+0

ええ@Henrik、それは私が最初にそれを試していない場合は悪いだろう! – gsamaras

+0

もちろん、それは精神ですが、それは含まれていないようです。 :)あなたの作業C++バージョンのみ。 – Henrik

答えて

5

このソリューション試してください:あなたが使用できるJava 8を使用している場合

String ipv6 = "2001:0db8:85a3:0000:0000:8a2e:0370:7334"; 
String[] spl = ipv6.split(":"); 
String result = "", del = ""; 
for (String s : spl) { 
    result += del 
      + String.format("%16s", new BigInteger(s, 16).toString(2)).replace(' ', '0'); 
    del = " "; 
} 
System.out.println(result); 

を:あなたはまた、このようにそれを行うことができます

String result = Stream.of(ipv6.split(":")) 
     .map(s -> String.format("%16s", new BigInteger(s, 16).toString(2)).replace(' ', '0')) 
     .collect(Collectors.joining(" ")); 

出力

0010000000000001 0000110110111000 1000010110100011 0000000000000000 0000000000000000 1000101000101110 0000001101110000 0111001100110100 
+1

あなたの答えとupvoteありがとうございました。 – gsamaras

2

を:

String ipv6 = "2001:0db8:85a3:0000:0000:8a2e:0370:7334"; 
String result = ""; 
for (String s : ipv6.split(":")) { 
    int value = Integer.parseInt(s, 16); 
    result += String.format("%16s", Integer.toBinaryString(value)).replace(' ', '0') + " "; 
} 

System.out.println(result); 

出力:

0010000000000001 0000110110111000 1000010110100011 0000000000000000 0000000000000000 1000101000101110 0000001101110000 0111001100110100 

EDIT

与えられたIPv6アドレスが圧縮されたときに、以前のソリューションが動作しません。たとえば、3210:0000:0000:0000:0000:0000:0000:00003210::に短縮できます。このような場合、これまでに提案されているソリューションは、最初に処理しなければ機能しません。その問題を解決するには、これを行うことができます:私はあまり圧縮されたIPアドレスを取得するためにJava's IPv6 representation class Inet6Addressを使用してい

ここ
String ipv6CompressedAddress = "3210::"; 
Inet6Address ipv6Address = (Inet6Address) Inet6Address.getByName(ipv6CompressedAddress); 
String ipv6 = ipv6Address.getCanonicalHostName(); //:0:0:0:0:0:0:0 

。次に、前述の方法を使用してバイナリに変換することができます。

+2

Juanに感謝しますが、最初に到着したので、私は他の答えを受け入れるつもりです。あなたのupvoteにもありがとう! – gsamaras

+1

混合モード( '2001:0db8 :: 10.11.12.13)も有効であり、考慮する必要があります。 –

+0

@RonMaupinはそれを指摘してくれてありがとう。そのモードもサポートされています。 –

関連する問題