Преобразовать IP-адрес в синтаксис точки из длинного целого без знака в iOS - PullRequest
2 голосов
/ 25 августа 2011

Я получаю IP-адрес в виде длинного целого без знака через JSON. Я пытаюсь затем преобразовать это обратно в удобочитаемую форму, то есть xxx.xxx.xxx.xxx.

Пример того, что я получаю в JSON:

"ip": 704210705

Я немного борюсь, потому что С никогда не был моей сильной стороной. Я получаю сообщение об ошибке EXC Bad Access по следующему адресу:

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

Я получаю сообщение об ошибке в строке символов (3).

Кто-нибудь может дать мне какой-нибудь совет?

Ответы [ 2 ]

5 голосов
/ 25 августа 2011
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})];
0 голосов
/ 17 августа 2015

Версия 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())
...