Reputation: 4575
I'm retrieving an IP address as an unsigned long integer via JSON. I'm trying to then convert this back to human readable form, ie xxx.xxx.xxx.xxx.
Example of what I receive in JSON:
"ip": 704210705
I'm struggling a bit as C was never my forte. I'm getting an EXC Bad Access error on the below:
unsigned long int addr = [[user objectForKey:@"ip"] unsignedLongValue];
struct in_addr *remoteInAddr = (struct in_addr *)addr;
char *sRemoteInAddr = inet_ntoa(*remoteInAddr);
I get the error on the char line (3).
Can anyone give me any advice?
Upvotes: 3
Views: 3462
Reputation: 25486
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)"
}
}
Then
print(UInt32(704210705).IPv4String())
Upvotes: 0
Reputation: 47094
struct in_addr a;
a.s_addr = addr;
char *remote = inet_ntoa(a);
note that the memory pointed to by remote
is statically allocated in libc. Therefore, further calls to inet_ntoa
will overwrite the previous result.
To get the string properly into obj-c land, use
NSString *str = [NSString stringWithUTF8String:remote];
Or, putting everything together:
NSString *str = [NSString stringWithUTF8String:inet_ntoa((struct in_addr){addr})];
Upvotes: 5