2016-11-24 15:57:17 dkq972958298 阅读数 7416

其中将十六进制字符串转换成NSData的代码如下:

- (NSData *)convertHexStrToData:(NSString *)str {
    if (!str || [str length] == 0) {
        return nil;
    }
    
    NSMutableData *hexData = [[NSMutableData alloc] initWithCapacity:8];
    NSRange range;
    if ([str length] % 2 == 0) {
        range = NSMakeRange(0, 2);
    } else {
        range = NSMakeRange(0, 1);
    }
    for (NSInteger i = range.location; i < [str length]; i += 2) {
        unsigned int anInt;
        NSString *hexCharStr = [str substringWithRange:range];
        NSScanner *scanner = [[NSScanner alloc] initWithString:hexCharStr];
        
        [scanner scanHexInt:&anInt];
        NSData *entity = [[NSData alloc] initWithBytes:&anInt length:1];
        [hexData appendData:entity];
        
        range.location += range.length;
        range.length = 2;
    }
    
    LEDEBUG(@"hexdata: %@", hexData);
    return hexData;
}

将NSData转换成十六进制的字符串则可使用如下方式:


- (NSString *)convertDataToHexStr:(NSData *)data {
    if (!data || [data length] == 0) {
        return @"";
    }
    NSMutableString *string = [[NSMutableString alloc] initWithCapacity:[data length]];
    
    [data enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {
        unsigned char *dataBytes = (unsigned char*)bytes;
        for (NSInteger i = 0; i < byteRange.length; i++) {
            NSString *hexStr = [NSString stringWithFormat:@"%x", (dataBytes[i]) & 0xff];
            if ([hexStr length] == 2) {
                [string appendString:hexStr];
            } else {
                [string appendFormat:@"0%@", hexStr];
            }
        }
    }];
    
    return string;
}





2016-08-18 23:02:25 sinat_20559947 阅读数 2860

创建UIColor的分类

//  UIColor+Addition.h

#import <UIKit/UIKit.h>

@interface UIColor (Addition)

/// 使用 16 进制数字创建颜色,例如 0xFF0000 创建红色
///
/// @param hex 16 进制无符号32位整数
///
/// @return 颜色
+ (instancetype)colorWithHex:(uint32_t)hex;

/// 生成随机颜色
///
/// @return 随机颜色
+ (instancetype)randomColor;

/// 使用 R / G / B 数值创建颜色
///
/// @param red   red
/// @param green green
/// @param blue  blue
///
/// @return 颜色
+ (instancetype)colorWithRed:(uint8_t)red green:(uint8_t)green blue:(uint8_t)blue;

@end
//  UIColor+Addition.m

#import "UIColor+Addition.h"

@implementation UIColor (Addition)

+ (instancetype)colorWithHex:(uint32_t)hex {
    uint8_t r = (hex & 0xff0000) >> 16;
    uint8_t g = (hex & 0x00ff00) >> 8;
    uint8_t b = hex & 0x0000ff;

    return [self colorWithRed:r green:g blue:b];
}

+ (instancetype)randomColor {
    return [UIColor colorWithRed:arc4random_uniform(256) green:arc4random_uniform(256) blue:arc4random_uniform(256)];
}

+ (instancetype)colorWithRed:(uint8_t)red green:(uint8_t)green blue:(uint8_t)blue {
    return [UIColor colorWithRed:red / 255.0 green:green / 255.0 blue:blue / 255.0 alpha:1.0];
}

@end
2014-05-26 14:59:34 binjly 阅读数 2532

首先吐槽下Objective-C的语法真的很让人抓狂!发火

最近在捣鼓IOS应用,其中核心部分需要做进制转换。因为是核心代码,比较追求性能,所以想着能不能像其它语言一样,找到原生的进制转换函数直接使用。于是谷歌都快被我玩烂了,就是找不到。如有知道Objective-C原生进制转换函数的朋友,还请不吝赐教!大笑

然后找不到就找不到吧,偷个懒找别人写的看看?可是找来找去,质量真的是参差不齐。最后无奈只好自己写一个了。

以下贴出来给大家参考,也给自己备忘。

int hex2dec(NSString *hex){
    int dec=0;
    int len = [hex length];
    int i;
    for(i=len-1;i>=0;i--) {
        unichar c = [hex characterAtIndex:i];
        if(c >= '0' && c <='9'){
            dec += (c-48)<<(4*(len-i-1));
        }else if(c >= 'A' && c <='F'){
            dec += (c-55)<<(4*(len-i-1));
        }else if(c >= 'a' && c <='f'){
            dec += (c-87)<<(4*(len-i-1));
        }
    }
    return dec;
}


2013-11-07 10:01:45 xin814 阅读数 741

iOS_二级制转十进制

- (NSInteger)toDecimalSystemWithBinarySystem:(NSString *)binary

{

    int ll = 0 ;

    int  temp = 0 ;

    for (int i = 0; i < binary.length; i ++)

    {

        temp = [[binary substringWithRange:NSMakeRange(i, 1)] intValue];

        temp = temp * powf(2, binary.length - i - 1);

        ll += temp;

    }

    

    NSString * result = [NSString stringWithFormat:@"%d",ll];

    

    return [result integerValue] ;

}

2015-06-04 19:46:50 pxd123147 阅读数 1115
这段时间公司做一个项目 与智能硬件交互的项目,需要用socket 通过16进制参数进行交互;

构造遥控数据帧 AC 01 00 32 00 5E 0B 02 01 9F 以这种形式;

 unsigned char cmd_switch[10];

        cmd_switch[0]=(char)0xAC;//start

        cmd_switch[1]=(char)0x1;//num 随便填

        //device address begin

        cmd_switch[2]=(char)0x0;

        cmd_switch[3]=(char)0x32;

        cmd_switch[4]=(char)0x0;

        cmd_switch[5]=(char)0x5e;

        //device address end

        cmd_switch[6]=(char)0x0B;// command

        cmd_switch[7]=(char)0x02;//data length

        cmd_switch[8]=(char)0x01;//data

        cmd_switch[9]=(char)0x0;//校验位,先初始化

NSData *senddata = [NSData dataWithBytes: cmd_switch  length:10];

        NSLog(@"send电量页面 %@",senddata);

        [socket writeData:senddata withTimeout:-1 tag:0];


这是写死数据,如果需要通过变量进行动态获取数据怎么办 我的char[]怎么往里面拼呢。我之前还傻傻的将0x通过字符串与变量拼进去放到数组里面 其实不是的0x代表16进制;后来通过各种尝试 找到了方法:将传入的数据变成十进制数据 放到数组里  例如  char[5]=(char)0x5e;将0x5e变成十进制 5*16+14=94 就是对应的十进制  然后char[5]=94

然后通过NSData *senddata = [NSData dataWithBytes: cmd_switch  length:10];方法自动转换成16进制。至于原理 我现在还不知道 可能是进行自动转换;解决了我很大问题;

没有更多推荐了,返回首页