打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

  在编写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下会输出:

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”。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Objective-NSString
C语言难点分析整理
C语言sprintf与sscanf函数[总结]
Objective
正则表达式在IOS中的应用及IOS中三种正则表达式的使用与比较
IOS之学习笔记一
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服