2

JSONを介してIPアドレスを符号なし長整数として取得しています。次に、これを人間が読める形式、つまりxxx.xxx.xxx.xxxに変換し直そうとしています。

JSONで受け取るものの例:

"ip": 704210705

Cは私の得意ではなかったので、私は少し苦労しています。以下でEXCBadAccessエラーが発生します。

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

char行(3)でエラーが発生します。

誰かアドバイスをいただけますか?

4

2 に答える 2

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

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

文字列をobj-cランドに正しく取り込むには、次を使用します。

NSString *str = [NSString stringWithUTF8String:remote];

または、すべてをまとめます。

NSString *str = [NSString stringWithUTF8String:inet_ntoa((struct in_addr){addr})];
于 2011-08-25T13:20:56.033 に答える
0

拡張子が付いたSwiftバージョン

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())
于 2015-08-17T07:56:22.457 に答える