分享

iOS: 处理被多个字符定义的特殊枚举值

 方海龙的书馆 2014-09-04

  在编写AVAudioRecorder相关程序时,发现AVFoundation中有如下枚举定义:

屏幕快照 2013-10-12 下午4.10.44

枚举值是由多个字符定义的,通常是4个字符,因为4个字符一共4字节正好组成一个int。那么怎样从这样的枚举值中获取相应的字符串信息呢?

我们需要先了解他,首先,这种定义在C/C++中是完全允许的,但是语言标准中并没有具体规定它的执行(参考)。在iOS/Mac环境下测试,结果是把每个字符的对应字节(字符的ASCII码)倒着拼成一个4字节的int,因为iOS也是Little Endian环境。

所以可以这样做:

1
2
3
4
5
6
7
8
int value = 'Mgen';
NSLog(@"%d", value);
//手动创建一个这样的常量
NSLog(@"%d", ('M' << 24) | ('g' << 16) | ('e' << 8) | 'n');

iOS 6下会输出:

1
2
3
1298621806
1298621806

当然,也可以直接从这个int中抽取每个字符的信息,如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int value = 'Mgen';
char *p = &value;
for(int i = 0; i < sizeof(int); i++)
{
    char c = p[i];
    NSLog(@"%c(%d)", c, c);
}

输出:

1
2
3
4
5
6
7
n(110)
e(101)
g(103)
M(77)

因为iOS是Little Endian的,所以结果是倒着的。

为了获取正着的值,需使用CFSwapInt32HostToBig函数来把Little Endian的int转换成Big Endian的形式,然后从指针中创建NSData,最后再从NSData中创建NSString就可以输出这个特殊枚举值的字符串内容了。(注意这个枚举值的字符串数据没有以\0结尾)

如下代码:

1
2
3
4
5
6
7
8
9
int value = 'Mgen';
value = CFSwapInt32HostToBig(value);
char *p = &value;
  
NSLog(@"%@", [[NSString alloc] initWithData:[NSData dataWithBytes:p length:sizeof(int)] encoding:NSUTF8StringEncoding]);
输出:
1
Mgen

另一种方法就是手动为字符串数据加入结束符(\0),然后作为C语言字符串输出也可以:

1
2
3
4
5
6
7
8
9
10
11
//将字节复制进数组,并添加字符串结尾\0
char bytes[sizeof(int) + 1];
memccpy(bytes, p, 1, sizeof(int));
bytes[sizeof(int)] = 0;
  
NSLog(@"%s", bytes);

同样也会正确输出“Mgen”。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多