2011-08-25 6 views
2

IPアドレスをJSON経由で符号なしロング整数として取得しています。私はこれを人間が読める形式、つまりxxx.xxx.xxx.xxxに変換しようとしています。私はJSONで受け取るもののIPアドレスをiOSの符号なしロング整数からドット構文に変換する

例:

"ip": 704210705 

Cは私の得意ではなかったように私は少し苦労しています。 EXC不正アクセスエラーが発生しました。

unsigned long int addr = [[user objectForKey:@"ip"] unsignedLongValue]; 
struct in_addr *remoteInAddr = (struct in_addr *)addr; 
char *sRemoteInAddr = inet_ntoa(*remoteInAddr); 

チャーライン(3)にエラーが表示されます。

誰でも助言をいただけますか?

+0

あなたが3行目にどのようなエラーが出るのですか? – Jack

+1

元の問題は実際に整数を使ってipsを送るjsonを持っているということです。遅かれ早かれIPv6をサポートしなければならないでしょう。それは変わることはありません。 –

+0

私は同意します...それは私のコントロールではありません:( – mootymoots

答えて

5
struct in_addr a; 
a.s_addr = addr; 
char *remote = inet_ntoa(a); 

remoteが指すメモリがlibcに静的に割り当てられていることに注意してください。したがって、inet_ntoaを呼び出すと、以前の結果が上書きされます。

NSString *str = [NSString stringWithUTF8String:remote]; 

あるいは、一緒にすべてを入れて使用し、OBJ-Cの土地に適切に文字列を取得するには、次の

NSString *str = [NSString stringWithUTF8String:inet_ntoa((struct in_addr){addr})]; 
+0

ありがとうございます - 私のコードでaddrを正しく守っていますか? – mootymoots

+0

btw a.s_addr = addr;でエラーが発生する - 宣言されていない識別子 'a'の使用 – mootymoots

+0

これは(struct in_addr a;を修正すると)機能しますが、IPアドレスが間違っています。 – mootymoots

0

Swift version, with extensionを。

extension UInt32 { 

    public func IPv4String() -> String { 

     let ip = self 

     let byte1 = UInt8(ip & 0xff) 
     let byte2 = UInt8((ip>>8) & 0xff) 
     let byte3 = UInt8((ip>>16) & 0xff) 
     let byte4 = UInt8((ip>>24) & 0xff) 

     return "\(byte1).\(byte2).\(byte3).\(byte4)" 
    } 
} 

その後

print(UInt32(704210705).IPv4String()) 
関連する問題