Objective c 将BCD字节数组转换为NSDecimalNumber
给定特定TLV标记的6字节数组:Objective c 将BCD字节数组转换为NSDecimalNumber,objective-c,nsdata,bcd,tlv,Objective C,Nsdata,Bcd,Tlv,给定特定TLV标记的6字节数组: unsigned char bytes[] = { 0x00, 0x00, 0x00, 0x01, 0x23, 0x45 }; NSData * data = [NSData dataWithBytes:bytes length:6]; 如何将其转换为值为的十进制数: 12345 我试着找到一些已经在基础上实现的东西,但是没有运气。 简单地mul和add: int sum = 0; for( int c = 0; c<6 c++ ) { sum *
unsigned char bytes[] = { 0x00, 0x00, 0x00, 0x01, 0x23, 0x45 };
NSData * data = [NSData dataWithBytes:bytes length:6];
如何将其转换为值为的十进制数:
12345
我试着找到一些已经在基础上实现的东西,但是没有运气。 简单地mul和add:
int sum = 0;
for( int c = 0; c<6 c++ )
{
sum *= 100; // shift up two decimal digits
sum += bytes[c] & 0xF + 10 * bytes[c] >> 4; // add new digits
}
NSNumber *result = [NSNumber numberWithInt:sum];
输入Safari。结果似乎与字节数组3和6位数无关,不同的顺序我用更好的例子更新了这个问题。此编码用于9F02 tlv标记,以表示十进制数。
// Step 1: convert data to string
NSMutableString *string = [[NSMutableString alloc] initWithCapacity:data.length];
unsigned char *bytes = [data bytes];
for (NSUInteger i = 0; i < [data length]; i++)
[string appendFormat:@"%.2x", bytes[i]];
// Step 2: convert string to decimal number
NSDecimalNumber *decimalNumber = [[NSDecimalNumber alloc] initWithString:string];