您的位置:首页 > 其它

OC有符号16进制整形转10进制整形

2017-12-12 17:15 896 查看
      
16进制有符号判断正负其实是将16进制转为2进制看最高位的值,如果是1则代表是负数,如果是0则代表正数,负数在计算机中是原数的补码,正数的补码就是原码,所以我们判断最高位是否是1,如果是1则最高位保持不变其余位按位取反则得到原码,这样我们可以这样想,我们不管这个16进制数是有符号还是无符号,我们都按无符号计算出来得到当前16进制数的无符号正数A,然后算出这个16进制数的-0也就是0X80.....(具体长度,视原16进制的长度而定)十进制数B和16进制数的最大值0XFF....(具体长度,视原16进制的长度而定)十进制数C,如果A
< B ,这时A的二进制的最高位肯定为0,所以是整数直接输出,如果A>B,这时A的二进制的最高位肯定为1,这时A是一个负数,直接拿A-C即可,这样不用去每位都拿出来,判断最高位在去取反什么的,相对来说简点(不考虑溢出的情况,简单的使用是可以的),现附上代码

//将任意长度有符号16进制NSData类型转NSNumber(整形)
-(NSNumber *)signedHexTurnString:(NSData *)data
{
    NSLog(@"%@", data);
    if (!data)
    {
        return nil;
    }
   
//获取data的长度
    NSInteger lenth = [data length];
    //获取16进制最大值
    NSString *maxHexString = [self headString:@"F" trilString:@"F" strLenth:lenth];
   
//获取16进制分界点
    NSString *centerHexString = [self headString:@"8" trilString:@"0" strLenth:lenth];
    //获取data字符串
    NSString *string = [self convertDataToHexString:data];

    if ([[self numberHexString:string] longLongValue] - [[self numberHexString:centerHexString] longLongValue] < 0) {
        return [self numberHexString:string];
    }
    return [NSNumber numberWithLongLong:[[self numberHexString:string] longLongValue] - [[self numberHexString:maxHexString] longLongValue]];
}
// 16进制转10进制
- (NSNumber *) numberHexString:(NSString *)aHexString
{
    // 空,直接返回.
    if (nil == aHexString)
    {
        return nil;
    }
    NSScanner * scanner = [NSScanner scannerWithString:aHexString];
    unsigned long long longlongValue;
    [scanner scanHexLongLong:&longlongValue];

    //将整数转换为NSNumber,存储到数组中
    NSNumber * hexNumber = [NSNumber numberWithLongLong:longlongValue];
    return hexNumber;
    
}
-(NSString *)headString:(NSString *)headStr trilString:(NSString *)trilStr strLenth:(NSInteger)lenth
{
    if (!headStr || !trilStr)
    {
        return nil;
    }
    //16进制获取最大值  和16进制有符号分界点
    NSMutableString *string = [NSMutableString stringWithFormat:@"0x%@", headStr];
    for (int i = 0; i < lenth * 2 - 1; i++)
    {
        [string appendString:trilStr];
    }
    return string;
}

//16进制转NSString
- (NSString *)convertDataToHexString:(NSData *)data {
    if (!data || [data length] == 0) {
        return @"";
    }
    NSMutableString *string = [NSMutableString stringWithString:@"0x"];

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

    return string;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: