开头
十六进制相关
需求一
- 获取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
number = decimal % 16
decimal = decimal / 16
switch (number) {
case 10:
letter =@"A\n"
case 11:
letter =@"B\n"
case 12:
letter =@"C\n"
case 13:
letter =@"D\n"
case 14:
letter =@"E\n"
case 15:
letter =@"F\n"
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
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]]