2017-12-12 17:15:26 wang_yuewen 阅读数 1914
  • Java进制转换和位运算专题

    本课程是零基础学JAVA课程的第二阶段的课程,课程内容详实、细致,讲解通俗易懂!内容包括:Java中的进制转换原理,十进制和二进制、八进制、十六进制的互相转换规律,位运算原理,按位与、按位或、按位取反、左移、右移、无符号右移的讲解!

    2648 人正在学习 去看看 孙探

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



2014-10-15 14:28:58 mingios 阅读数 537
  • Java进制转换和位运算专题

    本课程是零基础学JAVA课程的第二阶段的课程,课程内容详实、细致,讲解通俗易懂!内容包括:Java中的进制转换原理,十进制和二进制、八进制、十六进制的互相转换规律,位运算原理,按位与、按位或、按位取反、左移、右移、无符号右移的讲解!

    2648 人正在学习 去看看 孙探

+ (UIColor *)colorFromHexRGB:(NSString *)inColorString

{

    UIColor *result = nil;

    unsigned int colorCode = 0;

    unsigned char redByte, greenByte, blueByte;

    

    if (nil != inColorString)

    {

        NSScanner *scanner = [NSScanner scannerWithString:inColorString];

        (void) [scanner scanHexInt:&colorCode]; // ignore error

    }

    redByte = (unsigned char) (colorCode >> 16);

    greenByte = (unsigned char) (colorCode >> 8);

    blueByte = (unsigned char) (colorCode); // masks off high bits

    result = [UIColor

              colorWithRed: (float)redByte / 0xff

              green: (float)greenByte/ 0xff

              blue: (float)blueByte / 0xff

              alpha:1.0];

    return result;

}

2019-09-24 14:25:17 WangQingLei0307 阅读数 44
  • Java进制转换和位运算专题

    本课程是零基础学JAVA课程的第二阶段的课程,课程内容详实、细致,讲解通俗易懂!内容包括:Java中的进制转换原理,十进制和二进制、八进制、十六进制的互相转换规律,位运算原理,按位与、按位或、按位取反、左移、右移、无符号右移的讲解!

    2648 人正在学习 去看看 孙探

 

最近解除了一个项目需要进行各种进制之间和类型的之间的转化,今天和大家分享一下,希望对大家有帮助

第一个就是NSData进行异或计算(^就代表异或操作),再高级语言中这种计算方式可以说是很陌生的,平常基本使用不到今天分享一下计算过成

    __block uint8_t result = '\0' ;
    [data enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {
        unsigned char *dataBytes = (unsigned char*)bytes;
        for (NSInteger i = 0; i < byteRange.length; i++) {
            uint8_t cha = dataBytes[i];
            //此处代码为异或操作复制到result中
            result^=cha;
        }
    }];

将data放入该方法中,开始循环这个data.bytes内容,result就是最终结果。

将10进制转16进制


/**
 十进制转换十六进制
 
 @param decimal 十进制数
 @return 十六进制数
 */
+ (NSString *)getHexByDecimal:(NSInteger)decimal {
    
    NSString *hex =@"";
    NSString *letter;
    NSInteger number;
    for (int i = 0; i<9; i++) {
        
        number = decimal % 16;
        decimal = decimal / 16;
        switch (number) {
                
            case 10:
                letter =@"A"; break;
            case 11:
                letter =@"B"; break;
            case 12:
                letter =@"C"; break;
            case 13:
                letter =@"D"; break;
            case 14:
                letter =@"E"; break;
            case 15:
                letter =@"F"; break;
            default:
                letter = [NSString stringWithFormat:@"%ld", number];
        }
        hex = [letter stringByAppendingString:hex];
        if (decimal == 0) {
            
            break;
        }
    }
    return hex;
}

16进制形式的字符串转成16进制NSData类型


/**
 将16进制类型的字符串转成16进制的NSData类型

 @param str 字符串
 @return 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;
    }
    return hexData;
}

例如:字符串:1D1E0E00A12F6951AD17DF003C4E 结果:<1d1e0e00 a12f6951 ad17df00 3c4e>

将NSData转成可操作的字符串,十进制


/**
 将NSData转成可操作的字符串,十进制

 @param data nsdata
 @return 转化结果
 */
+ (NSString *)sconvertDataToHexStr:(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;
}

两个NSData进行异或计算


/**
 异或计算(XOR)

 @param sourceData 第一个
 @param keyData 第二二
 @return 结果
 */
+ (NSData *)xor_EncodeData:(NSData *)sourceData withKey:(NSData *)keyData {
    Byte *keyBytes = (Byte *)[keyData bytes]; //取关键字的Byte数组, keyBytes一直指向头部
    Byte *sourceDataPoint = (Byte *)[sourceData bytes]; //取需要加密的数据的Byte数组
    for (long i = 0; i < [sourceData length]; i++) {
        sourceDataPoint[i] = sourceDataPoint[i] ^ keyBytes[i]; //然后按位进行异或运算
    }
    return sourceData;
}

再附上几个开发过程中常用到的小方法?

MD5加密


/**
 MD5加密

 @param password 密码
 @return 加密后的密码
 */
+ (NSString *)MD5StringWithPassWord:(NSString*)password {
    if ([password isKindOfClass:[NSString class]]) {
        NSString *str = (NSString *)password;
        const char *cStr = [str UTF8String];
        unsigned char result[16];
        CC_MD5(cStr, (CC_LONG)strlen(cStr), result);
        return [[NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",result[0], result[1], result[2], result[3], result[4], result[5], result[6], result[7],result[8], result[9], result[10], result[11],result[12], result[13], result[14], result[15]] lowercaseString];
    }else{
        return nil;
    }
}

json字符串转成字典

/**
 json转字典

 @param jsonString json
 @return 字典
 */
+ (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString{
    if (jsonString == nil) {
        return nil;
    }
    NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
    NSError *err;
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData
                                                        options:NSJSONReadingMutableContainers
                                                          error:&err];
    if(err){
        NSLog(@"json解析失败:%@",err);
        return nil;
    }
    return dic;
}

将字典转json字符串


/**
 将字典转成j字符串

 @param dict 字典
 @return 字符串
 */
+ (NSString *)convertToJsonData:(NSDictionary *)dict{
    NSError *error;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&error];
    NSString *jsonString;
    if (!jsonData) {
        NSLog(@"%@",error);
    }else{
        jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];
    }
    NSMutableString *mutStr = [NSMutableString stringWithString:jsonString];
    NSRange range = {0,jsonString.length};
    //去掉字符串中的空格
    [mutStr replaceOccurrencesOfString:@" " withString:@"" options:NSLiteralSearch range:range];
    NSRange range2 = {0,mutStr.length};
    //去掉字符串中的换行符
    [mutStr replaceOccurrencesOfString:@"\n" withString:@"" options:NSLiteralSearch range:range2];
    return mutStr;
}

 

判断字符串是否为空


/**
 判断字符串是否为空

 @param aStr 传入的内容
 @return YES 不是字符串
 */
+ (BOOL)isEmptyOrNull:(NSString *)aStr {
    if (![aStr isKindOfClass:[NSString class]]) {
        return YES;
    }
    if (!aStr) {
        return YES;
    }
    if ([aStr isKindOfClass:[NSNull class]]) {
        return YES;
    }
    if (!aStr.length) {
        return YES;
    }
    if (aStr == nil) {
        return YES;
    }
    if (aStr == NULL) {
        return YES;
    }
    NSCharacterSet *set = [NSCharacterSet whitespaceAndNewlineCharacterSet];
    NSString *trimmedStr = [aStr stringByTrimmingCharactersInSet:set];
    if (!trimmedStr.length) {
        return YES;
    }
    return NO;
}

判断数组是否为空


/**
 判断数组是否为空
 
 @param arr 数组
 @return bool
 */
+(BOOL)isEmptyArrOrNull:(NSMutableArray*)arr{
    if (![arr isKindOfClass:[NSMutableArray class]] || ![arr isKindOfClass:[NSArray class]]) {
        return YES;
    }
    if (arr == nil) {
        return YES;
    }
    if (arr.count == 0) {
        return YES;
    }
    if (arr == NULL) {
        return YES;
    }
    return NO;
}

判断字典是否为空


/**
 判断字典是否为空
 
 @param dic 数组
 @return bool
 */
+(BOOL)isEmptyDictionaryOrNull:(NSDictionary*)dic{
    if (dic == nil) {
        return YES;
    }
    if (![dic isKindOfClass:[NSDictionary class]]) {
        return YES;
    }
    if (dic.count == 0) {
        return YES;
    }
    if (dic == NULL) {
        return YES;
    }
    
    return NO;
}

判断手机是否是异形曲面屏iPhone X等,需要导入一个官方类#import <sys/utsname.h>


/**
 判断手机是否是异形屏幕
 
 @return YES 是 异形屏幕
 */
+ (BOOL)iphoneIsProfiledScreen {
    struct utsname systemInfo;
    uname(&systemInfo);
    NSString*platform = [NSString stringWithCString: systemInfo.machine encoding:NSASCIIStringEncoding];
    if([platform isEqualToString:@"iPhone10,3"] || [platform isEqualToString:@"iPhone10,6"]  || [platform isEqualToString:@"iPhone11,8"] || [platform isEqualToString:@"iPhone11,2"] || [platform isEqualToString:@"iPhone11,6"] || [platform isEqualToString:@"iPhone11,4"] ) {
        return YES;
    } else {
        return NO;
    }
}

将数组转成字符串


/**
 将数组转成字符串

 @param arrJson 数据
 @return 字符串
 */
+ (NSString *)jsonStringCompactFormatForNSArray:(NSArray *)arrJson {
    if (![arrJson isKindOfClass:[NSArray class]] || ![NSJSONSerialization isValidJSONObject:arrJson]) {
        return nil;
    }
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:arrJson options:0 error:nil];
    NSString *strJson = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    return strJson;
}

 

2017-09-19 00:23:35 cjm2484836553 阅读数 14001
  • Java进制转换和位运算专题

    本课程是零基础学JAVA课程的第二阶段的课程,课程内容详实、细致,讲解通俗易懂!内容包括:Java中的进制转换原理,十进制和二进制、八进制、十六进制的互相转换规律,位运算原理,按位与、按位或、按位取反、左移、右移、无符号右移的讲解!

    2648 人正在学习 去看看 孙探

【转载请注明出处:From 李诗雨—http://blog.csdn.net/cjm2484836553/article/details/78025443

不诗意的女程序猿不是好厨师~

最近又是对老项目各种修改,这期间经常要和ios统一一些样式颜色等等,ios总是喜欢用百分比的透明度,而Android基本是16进制。每次我都懒得计算,所以,我就索性从网上找了对照表,每次就对着表查,人太懒太笨真的是件很苦恼的事情。

100% — FF
99% — FC
98% — FA
97% — F7
96% — F5
95% — F2
94% — F0
93% — ED
92% — EB
91% — E8
90% — E6
89% — E3
88% — E0
87% — DE
86% — DB
85% — D9
84% — D6
83% — D4
82% — D1
81% — CF
80% — CC
79% — C9
78% — C7
77% — C4
76% — C2
75% — BF
74% — BD
73% — BA
72% — B8
71% — B5
70% — B3
69% — B0
68% — AD
67% — AB
66% — A8
65% — A6
64% — A3
63% — A1
62% — 9E
61% — 9C
60% — 99
59% — 96
58% — 94
57% — 91
56% — 8F
55% — 8C
54% — 8A
53% — 87
52% — 85
51% — 82
50% — 80
49% — 7D
48% — 7A
47% — 78
46% — 75
45% — 73
44% — 70
43% — 6E
42% — 6B
41% — 69
40% — 66
39% — 63
38% — 61
37% — 5E
36% — 5C
35% — 59
34% — 57
33% — 54
32% — 52
31% — 4F
30% — 4D
29% — 4A
28% — 47
27% — 45
26% — 42
25% — 40
24% — 3D
23% — 3B
22% — 38
21% — 36
20% — 33
19% — 30
18% — 2E
17% — 2B
16% — 29
15% — 26
14% — 24
13% — 21
12% — 1F
11% — 1C
10% — 1A
9% — 17
8% — 14
7% — 12
6% — 0F
5% — 0D
4% — 0A
3% — 08
2% — 05
1% — 03
0% — 00




积累点滴,做好自己~

2015-04-09 15:32:33 Ye_1314 阅读数 515
  • Java进制转换和位运算专题

    本课程是零基础学JAVA课程的第二阶段的课程,课程内容详实、细致,讲解通俗易懂!内容包括:Java中的进制转换原理,十进制和二进制、八进制、十六进制的互相转换规律,位运算原理,按位与、按位或、按位取反、左移、右移、无符号右移的讲解!

    2648 人正在学习 去看看 孙探

/*!

 * @method 通过16进制计算颜色

 * @abstract

 * @discussion

 * @param 16机制

 * @result 颜色对象

 */


+ (UIColor *)colorFromHexRGB:(NSString *)inColorString

{

    UIColor *result = nil;

    unsigned int colorCode = 0;

    unsigned char redByte, greenByte, blueByte;

    

    if (nil != inColorString)

    {

        NSScanner *scanner = [NSScanner scannerWithString:inColorString];

        (void) [scanner scanHexInt:&colorCode]; // ignore error

    }

    redByte = (unsigned char) (colorCode >> 16);

    greenByte = (unsigned char) (colorCode >> 8);

    blueByte = (unsigned char) (colorCode); // masks off high bits

    result = [UIColor

              colorWithRed: (float)redByte / 0xff

              green: (float)greenByte/ 0xff

              blue: (float)blueByte / 0xff

              alpha:1.0];

    return result;

}

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