代码之家  ›  专栏  ›  技术社区  ›  Said Sikira

将BCD字节数组转换为NSDecimalNumber

  •  0
  • Said Sikira  · 技术社区  · 7 年前

    给定特定TLV标记的6字节数组:

    unsigned char bytes[] = { 0x00, 0x00, 0x00, 0x01, 0x23, 0x45 };
    NSData * data = [NSData dataWithBytes:bytes length:6];
    

    如何将其转换为值为的十进制数:

    12345
    

    我试图找到一些已经在Foundation中实现的东西,但运气不好。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Willeke    7 年前
    // 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];
    
        2
  •  0
  •   Amin Negm-Awad    7 年前

    只需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。