在编写AVAudioRecorder相关程序时,发现AVFoundation中有如下枚举定义:
枚举值是由多个字符定义的,通常是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下会输出:
当然,也可以直接从这个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);
}
|
输出:
因为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]);
|
输出:
另一种方法就是手动为字符串数据加入结束符(\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”。
|