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;
}
相关文章推荐
- oc 10进制数转16进制字符串
- C# 10进制 16进制 互转
- 数组中hashCode就是内存地址,以及汉字幻化为16进制或10进制
- 16进制转10进制使用霍纳算法(java版)
- javascript 进制转换(2进制、8进制、10进制、16进制之间的转换)
- 16进制转10进制(最easy的做法)
- java byte 16进制转 10进制
- 16进制、10进制、BCD码之间的转换
- C++中字符串(16进制)转为10进制
- C# 判断是否为2进制,8进制,10进制,16进制字符
- 自己实现10进制转2进制和16进制
- C++ 蓝桥杯基础训练 10进制转16进制
- 【原】VC++ 中实现进制2进制,10进制,16进制的相互转换
- VC++ 中实现进制2进制,10进制,16进制的相互转换
- sql实现10进制转16进制(转)
- C/C++编程语言之进制转换16进制字符串转10进制字符串
- js 解密 16进制转10进制,再取ascii码的对应值
- python的16进制和10进制间的转换
- C语言中各种进制间的转换(2进制,8进制,10进制,16进制)
- 将一个任意输入的10进制数转化为16进制形式输出