零基础iOS开发学习日记-数据处理

799 阅读2分钟

开头

十六进制相关

需求一

  • 获取Bin文件的二进制数据,并将二进制的数据长度转换成十六进制,并按位存储,下面的例子为存储为4位十六进制数组
  • 第一步,获取Bin文件的二进制数组
- (NSArray *)convertBinFileToNSArrayWithFileName:(NSString *)name {
    NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:nil];
    NSData *data = [NSData dataWithContentsOfFile:path];
    NSMutableData *mData = [NSMutableData dataWithData:data];
    NSLog(@"%@", mData);
    
    NSUInteger Len = [mData length];
    UInt8 *recv = (UInt8 *)[data bytes];
    
    //把接收到的数据存放在recvData数组中
    NSMutableArray *dataArr = [[NSMutableArray alloc] init];
    NSUInteger j = 0;
    while (j < Len) {
        [dataArr addObject:[NSNumber numberWithUnsignedChar:recv[j]]];
        j++;
    }
    return dataArr;
    
}
  • 第二步,将十进制数转换成十六进制的字符串
- (NSString *) getFileHexStringWithFileName:(NSString *)name
{
    NSArray *dataArr = [self convertBinFileToNSArrayWithFileName:name];
    return [self getHexByDecimal:dataArr.count];
}

- (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\n"; break;
            case 11:
                letter =@"B\n"; break;
            case 12:
                letter =@"C\n"; break;
            case 13:
                letter =@"D\n"; break;
            case 14:
                letter =@"E\n"; break;
            case 15:
                letter =@"F\n"; break;
            default:
                letter = [NSString stringWithFormat:@"%ld\n", (long)number];
        }
        hex = [letter stringByAppendingString:hex];
        if (decimal == 0) {
            
            break;
        }
    }
    return hex;
}
  • 第三步,将十六进制字符串处理为四个十六进制字符串,并按照需要进行补零
- (NSArray *) getFileHexArrWithHexString:(NSString *)fileSizeStr {
    int count = (int)(16 - fileSizeStr.length) * 0.5;
    for (int i = 0; i < count; i++) {
        fileSizeStr = [NSString stringWithFormat:@"0\n%@", fileSizeStr];
    }
    NSMutableString *mFileSizeStr = [NSMutableString stringWithString:fileSizeStr];
    __block NSString *hex = @"";
    __block NSMutableArray *mFileSizeHexArr = [NSMutableArray arrayWithCapacity:4];
    __block int hexI = 0;
    [mFileSizeStr enumerateLinesUsingBlock:^(NSString * _Nonnull line, BOOL * _Nonnull stop) {
        hex = [hex stringByAppendingString:line];
        if (hex.length == 2) {
            mFileSizeHexArr[hexI] = hex;
            hex = @"";
            hexI = hexI + 1;
        }
    }];
    return mFileSizeHexArr.copy;
}
  • 第四步,将以上处理好的四个十六进制字符串,再转换成十六进制数,用NSNumber存储,加入发送的数据数组dataArr
NSArray *fileSizeArr = [self getFileHexArrWithHexString:[self getFileHexStringWithFileName:self.updateFileName]];
unsigned long fileSizeHexOne = strtoul([fileSizeArr[0] UTF8String],0,16);
unsigned long fileSizeHexTwo = strtoul([fileSizeArr[1] UTF8String],0,16);
unsigned long fileSizeHexThree = strtoul([fileSizeArr[2] UTF8String],0,16);
unsigned long fileSizeHexFour = strtoul([fileSizeArr[3] UTF8String],0,16);
    
[dataArr addObject:[NSNumber numberWithUnsignedLong:fileSizeHexOne]];
[dataArr addObject:[NSNumber numberWithUnsignedLong:fileSizeHexTwo]];
[dataArr addObject:[NSNumber numberWithUnsignedLong:fileSizeHexThree]];
[dataArr addObject:[NSNumber numberWithUnsignedLong:fileSizeHexFour]];