【问题标题】:Objective-C - Hex to unsigned char array algorithmObjective-C - 十六进制到无符号字符数组算法
【发布时间】:2015-12-14 09:41:03
【问题描述】:

假设我们有十六进制 0x83,它具有二进制表示:

  1  0  0  0  0  0  1  1  <- binary
-------------------------
  8  7  6  5  4  3  2  1  <- position
-------------------------
 13 12 11 10 03 02 01 00  <- mapping value

如果指定位置有“1”,则显示的值将放置在输出数组中。在上面的示例中,输出数组应该是:

unsigned char output[] = { 0x13, 0x01, 0x00 }

另一方面,如果输入为 0xFF,则输出应为:

unsigned char output[] = { 0x13, 0x12, 0x11, 0x10, 0x03, 0x02, 0x01, 0x00 }

我知道我可以循环输入,但如果可能的话,我想以“更智能的方式”(可能是移位或某种字典)来完成。

【问题讨论】:

  • 除了大量的if语句之外,没有字节移位的循环是唯一的方法......
  • 什么是映射值?看起来它们是某种基于 4 的系统?就像第 9 位一样,它会是“20”?
  • 只有8个八位,没有更多了。

标签: objective-c arrays hex


【解决方案1】:

你可以把它比作一个面具,像这样:

//    1111 1110 FE
//    1111 1101 FD
//    1111 1011 FB
//    1111 0111 F7
//    1110 1111 EF
//    1101 1111 DF
//    1011 1111 BF
//    0111 1111 7F

int i = 0x83;

NSMutableArray *ar = [[NSMutableArray alloc] init];

if ((i&0x7F) != i) {
    [ar addObject:[NSNumber numberWithInteger:0x13]];
}
if ((i&0xBF) != i) {
    [ar addObject:[NSNumber numberWithInteger:0x12]];
}
if ((i&0xDF) != i) {
    [ar addObject:[NSNumber numberWithInteger:0x11]];
}
if ((i&0xEF) != i) {
    [ar addObject:[NSNumber numberWithInteger:0x10]];
}
if ((i&0xF7) != i) {
    [ar addObject:[NSNumber numberWithInteger:0x03]];
}
if ((i&0xFB) != i) {
    [ar addObject:[NSNumber numberWithInteger:0x02]];
}
if ((i&0xFD) != i) {
    [ar addObject:[NSNumber numberWithInteger:0x01]];
}
if ((i&0xFE) != i) {
    [ar addObject:[NSNumber numberWithInteger:0x00]];
}

【讨论】:

  • 我认为这就是循环for(明白)?
  • 所有if 语句都可以简化为:if (i &amp; 0x80)if (i &amp; 0x40) 等,可简化为if (i &amp; 0x01)。换句话说,只需检查特定位是否已设置。
猜你喜欢
  • 1970-01-01
  • 2011-08-24
  • 2023-04-11
  • 2012-05-30
  • 2011-06-15
  • 2013-04-15
  • 2018-05-17
  • 1970-01-01
  • 2022-09-22
相关资源
最近更新 更多