Làm cách nào để xác nhận địa chỉ IP trong Objective-C?Làm cách nào để xác nhận địa chỉ IP với cụm từ thông dụng trong Objective-C?
Trả lời
Đây là một cách tiếp cận thay thế cũng có thể hữu ích. Giả sử bạn có một NSString*
có chứa địa chỉ IP của bạn, gọi ipAddressStr
, của định dạng a.b.c.d:
int ipQuads[4];
const char *ipAddress = [ipAddressStr cStringUsingEncoding:NSUTF8StringEncoding];
sscanf(ipAddress, "%d.%d.%d.%d", &ipQuads[0], &ipQuads[1], &ipQuads[2], &ipQuads[3]);
@try {
for (int quad = 0; quad < 4; quad++) {
if ((ipQuads[quad] < 0) || (ipQuads[quad] > 255)) {
NSException *ipException = [NSException
exceptionWithName:@"IPNotFormattedCorrectly"
reason:@"IP range is invalid"
userInfo:nil];
@throw ipException;
}
}
}
@catch (NSException *exc) {
NSLog(@"ERROR: %@", [exc reason]);
}
Bạn có thể sửa đổi các khối có điều kiện if
theo RFC 1918 hướng dẫn, nếu bạn cần có mức độ xác nhận.
Alex, ý của bạn là đặt '&' trước mỗi đối số ipQuad vào sscanf? –
Ý tôi là, nhưng tôi thì không. Tôi sẽ chỉnh sửa câu trả lời sau khi tôi thêm nhận xét này. Ngoài ra, tôi đã thay đổi kiểu 'ipQuads' từ' unsigned char' thành 'unsigned int', để kiểm tra có cơ hội thất bại. –
Vì iOS 4 RegExps khả dụng trong iOS SDK: http://developer.apple.com/library/IOs/#documentation/Foundation/Reference/NSRegularExpression_Class/Reference/Reference.html ... vì vậy, có thể nếu bạn muốn đánh dấu câu trả lời này không được dùng nữa "nhưng hữu ích cho mục đích thông tin hoặc giáo dục" sẽ giúp :) –
Một thủ thuật bạn có thể làm là kiểm tra sự trở lại của cuộc gọi BSD inet_aton như thế này:
#include <arpa/inet.h>
- (BOOL)isIp:(NSString*)string{
struct in_addr pin;
int success = inet_aton([string UTF8String],&pin);
if (success == 1) return TRUE;
return FALSE;
}
Hãy tuy nhiên ý thức được rằng đây xác nhận chuỗi nếu nó có chứa một địa chỉ IP ở định dạng bất kỳ, nó không bị hạn chế với định dạng chấm chấm.
FYI: 'inet_aton' đã không được hỗ trợ cho' inet_pton', xử lý IPv6. – mattt
Xin vui lòng nếu yo đang trả về một boolean từ một nếu kiểm tra chỉ trả lại nếu kiểm tra chính nó tức là 'trở về thành công == 1' –
Đây là danh mục sử dụng inet_pton hiện đại sẽ trả về CÓ cho chuỗi IPv4 hoặc IPv6 hợp lệ.
#include <arpa/inet.h>
@implementation NSString (IPValidation)
- (BOOL)isValidIPAddress
{
const char *utf8 = [self UTF8String];
int success;
struct in_addr dst;
success = inet_pton(AF_INET, utf8, &dst);
if (success != 1) {
struct in6_addr dst6;
success = inet_pton(AF_INET6, utf8, &dst6);
}
return success == 1;
}
@end
Để tham khảo trong tương lai, sự thành công == 1? TRUE: FALSE không cần thiết. Một thành công đơn giản == 1 sẽ hoạt động. – varikin
Swift phiên bản:
func isIPAddressValid(ip: String) -> Bool {
guard let utf8Str = (ip as NSString).utf8String else {
return false
}
let utf8:UnsafePointer<Int8> = UnsafePointer(utf8Str)
var success: Int32
var dst: in_addr = in_addr()
success = inet_pton(AF_INET, utf8, &dst)
if (success != 1) {
var dst6: in6_addr? = in6_addr()
success = inet_pton(AF_INET6, utf8, &dst6);
}
return success == 1
}
Tôi không hiểu nó. Tại sao nó phải là biểu thức chính quy? – soulmerge
Bạn có thể tốt hơn với NSScanner, vì không có thư viện regex cài sẵn. –
Tôi có thể làm điều này với NSSCanner bằng cách nào? – diana