Objective-C常用方法整理

对于开发而言,每个人都有属于自己的一套开发工具类和一套开发组件库,以下我整理了部分内容,具体的方法声明就不写了,只写方法实现,具体内容可查看文章结尾附件。

//对象转字典
+ (NSDictionary*)getObjectData:(id)obj
{
    NSMutableDictionary *dic = [NSMutableDictionary dictionary];
    unsigned int propsCount;
    objc_property_t *props = class_copyPropertyList([obj class], &propsCount);//获得属性列表
    for(int i = 0;i < propsCount; i++)
    {
        objc_property_t prop = props[i];
        
        NSString *propName = [NSString stringWithUTF8String:property_getName(prop)];//获得属性的名称
        id value = [obj valueForKey:propName];//kvc读值
        if(value == nil)
        {
            value = [NSNull null];
        }
        else
        {
            value = [self getObjectInternal:value];//自定义处理数组,字典,其他类
            [dic setObject:value forKey:propName];
        }
    }
    return dic;
}
+ (id)getObjectInternal:(id)obj
{
    if([obj isKindOfClass:[NSString class]]
       || [obj isKindOfClass:[NSNumber class]]
       || [obj isKindOfClass:[NSNull class]])
    {
        return obj;
    }
    
    if([obj isKindOfClass:[NSArray class]])
    {
        NSArray *objarr = obj;
        NSMutableArray *arr = [NSMutableArray arrayWithCapacity:objarr.count];
        for(int i = 0;i < objarr.count; i++)
        {
            [arr setObject:[self getObjectInternal:[objarr objectAtIndex:i]] atIndexedSubscript:i];
        }
        return arr;
    }
    
    if([obj isKindOfClass:[NSDictionary class]])
    {
        NSDictionary *objdic = obj;
        NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:[objdic count]];
        for(NSString *key in objdic.allKeys)
        {
            [dic setObject:[self getObjectInternal:[objdic objectForKey:key]] forKey:key];
        }
        return dic;
    }
    return [self getObjectData:obj];
}

 

//MD5加密
+ (NSString *)md5:(NSString *)input {
    
    const char *cStr = [input UTF8String];
    unsigned char digest[CC_MD5_DIGEST_LENGTH];
    
    CC_MD5(cStr,(CC_LONG)strlen(cStr), digest);
    
    NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
    
    for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
        
        [output appendFormat:@"%02X",digest[i]];
    }
    
    return output;
}


//SHA512加密
+ (NSString *)sha512:(NSString *)input {
    
    const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:input.length];
    uint8_t digest[CC_SHA512_DIGEST_LENGTH];
    CC_SHA512(data.bytes, (unsigned int)data.length, digest);
    NSMutableString* output = [NSMutableString  stringWithCapacity:CC_SHA512_DIGEST_LENGTH * 2];
    
    for(int i = 0; i < CC_SHA512_DIGEST_LENGTH; i++) {
     
        [output appendFormat:@"%02x", digest[i]];
    }
    return output;
}

// 是否WIFI
+ (BOOL)isEnableWIFI {
    return ([[Reachability reachabilityWithHostName:@"www.baidu.com"] currentReachabilityStatus] == ReachableViaWiFi);
}

// 是否3G
+ (BOOL)isEnable3G {
    return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] == ReachableViaWWAN);
}


/**
 *  MNC
 中国移动: 00 02 07
 中国联通: 01 06
 中国电信: 03 05 11
 返回运营商名称
 */
+ (DNCarrierName)getCarrierName{
    
    CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc]init];
    
    CTCarrier *carrier = [info subscriberCellularProvider];
    
    NSString *countryCode = [carrier mobileCountryCode];
    NSString *networkCode = [carrier mobileNetworkCode];
    
    //中国地区码
    if ([countryCode isEqualToString:@"460"]) {
        
        
        if ([networkCode isEqualToString:@"00"] ||
            [networkCode isEqualToString:@"02"] ||
            [networkCode isEqualToString:@"07"]) {
            // 中国移动: 00 02 07
            return DNChinaMobile;
            
        }else if ([networkCode isEqualToString:@"01"] ||
                  [networkCode isEqualToString:@"06"] ) {
            
            // 中国联通:  01 06
            return DNChinaUnicom;
            
        }else if ([networkCode isEqualToString:@"03"] ||
                  [networkCode isEqualToString:@"05"] ||
                  [networkCode isEqualToString:@"11"]) {
            
            // 中国电信: 03 05 11
            return DNChinaTelecom;
        }
    }
    return DNCarrierNameNone;
}

//判断手机号码是否合法
+ (BOOL)isMobileNumber:(NSString *)mobileNum {
    
    //    电信号段:133/153/180/181/189/173/177
    //    联通号段:130/131/132/155/156/185/186/145/176
    //    移动号段:134/135/136/137/138/139/150/151/152/157/158/159/182/183/184/187/188/147/178
    //    虚拟运营商:170
    
    NSString *MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|8[0-9]|7[036-8])\\d{8}$";
    
    NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
    
    return [regextestmobile evaluateWithObject:mobileNum];
}

//二进制转16进制
+ (NSString*)byteToString:(NSData*)data {
    
    Byte *plainTextByte = (Byte *)[data bytes];
    NSString *hexStr=@"";
    for(int i=0;i<[data length];i++)
    {
        NSString *newHexStr = [NSString stringWithFormat:@"%x",plainTextByte[i]&0xff];///16进制数
        if([newHexStr length]==1)
            hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr];
        else
            hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
    }
    return hexStr;
}

//生成16位随机向量
+ (NSString *)randstringWithLength:(NSUInteger)length {
    
    NSMutableData *data = [NSMutableData dataWithLength:length];
    
    int result = SecRandomCopyBytes(kSecRandomDefault, length, data.mutableBytes);
    
    if (result == 0) {
        
        return [[DNCommonTool byteToString:data] substringToIndex:length];
    }else
        
        return nil;
}


//获取当前时间戳 单位ms
+ (NSString *)currentTimeStampString {
    
    NSTimeInterval interval =  [[NSDate date] timeIntervalSince1970]*1000;
    return [NSString stringWithFormat:@"%ld", (long)interval];
}

//AES-CFB-256加密
+ (NSData *)AES256Operation:(CCOperation)operation data:(NSData *)data key:(NSString *)key iv:(NSString *)iv
{
    char keyPtr[kCCKeySizeAES256 + 1]; //32位KEY
    memset(keyPtr, 0, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    char ivPtr[kCCBlockSizeAES128 + 1]; //16位向量
    memset(ivPtr, 0, sizeof(ivPtr));
    [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
    NSUInteger dataLength = [data length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    size_t numBytesCrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(operation,
                                          kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding,
                                          keyPtr,
                                          kCCKeySizeAES256,
                                          ivPtr,
                                          [data bytes],
                                          dataLength,
                                          buffer,
                                          bufferSize,
                                          &numBytesCrypted);
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
    }
    free(buffer);
    return nil;
}

+ (NSData *)AES256EncryptWithData:(NSData *)data Key:(NSString *)key iv:(NSString *)iv
{
    return [DNCommonTool AES256Operation:kCCEncrypt data:data key:key iv:iv];
}

+ (NSData *)AES256DecryptWithData: (NSData *)data Key:(NSString *)key iv:(NSString *)iv
{
    return [DNCommonTool AES256Operation:kCCDecrypt data:data key:key iv:iv];
}

 

//3DES 加密
+ (NSString *)TripleDESEncryptWithplainText:(NSString*)plainText key:(NSString *)key iv:(NSString *)iv {
    
    const void *vplainText;
    size_t plainTextBufferSize;
    
    NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
    plainTextBufferSize = [data length];
    vplainText = (const void *)[data bytes];
    
    CCCryptorStatus ccStatus;
    uint8_t *bufferPtr = NULL;
    size_t bufferPtrSize = 0;
    size_t movedBytes = 0;
    
    bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
    bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
    memset((void *)bufferPtr, 0x0, bufferPtrSize);
    
    const void *vkey = (const void *)[key UTF8String];
    const void *ivPrt = (const void *)[iv UTF8String];
    
    ccStatus = CCCrypt(kCCEncrypt,
                       kCCAlgorithm3DES,
                       kCCOptionPKCS7Padding ,//kCCOptionECBMode
                       vkey,
                       kCCKeySize3DES,
                       ivPrt,
                       vplainText,
                       plainTextBufferSize,
                       (void *)bufferPtr,
                       bufferPtrSize,
                       &movedBytes);
    
    if (ccStatus == kCCSuccess) {
        NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
        NSString *result = [myData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
        
        return result;
    }
    
    free(bufferPtr);
    return nil;
}


总结的也不一定全面,如有什么疑问,请加我扣扣:1123231279私聊我即可。

GitHub地址:传送门

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值