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