1. 程式人生 > >OC有符號16進位制整形轉10進位制整形

OC有符號16進位制整形轉10進位制整形

       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;
}