Ios 如何将AVAudioRecorder提供的数据重新解释为常量字符*?
问题: 我试图解决的问题如下。我有AVAudioRecorder记录的音频数据。我可以通过以下方式获取NSR数据:Ios 如何将AVAudioRecorder提供的数据重新解释为常量字符*?,ios,objective-c,string,data-conversion,avaudiorecorder,Ios,Objective C,String,Data Conversion,Avaudiorecorder,问题: 我试图解决的问题如下。我有AVAudioRecorder记录的音频数据。我可以通过以下方式获取NSR数据: NSData *data = [NSData dataWithContentsOfURL: self.audioRecorder.url]; 但接下来我需要将这个NSData转换/重新解释为const char*形式,它基本上看起来像 00 01 00 ff 以十六进制表示的字节或至少等效的字符串。它们不必是真正的十六进制,只需要转换成十六进制即可 问题: 我的问题是NSDa
NSData *data = [NSData dataWithContentsOfURL: self.audioRecorder.url];
但接下来我需要将这个NSData转换/重新解释为const char*形式,它基本上看起来像
00 01 00 ff
以十六进制表示的字节或至少等效的字符串。它们不必是真正的十六进制,只需要转换成十六进制即可
问题:
我的问题是NSData中有“\0”。所以如果我做这样的事情:
NSUInteger len = [data length];
Byte *byteData = (Byte*)malloc(len);
memcpy(byteData, [data bytes], len);
当数据遇到第一个“\0”时,它将被切断,因此无法工作。我是超级新的音频文件,但我认为这是因为在头的x00值。所以基本上,我不希望它们被解释为“\0”,而是被解释为“00”。有什么方法可以做到这一点吗?我不确定我是否理解这个问题,或者你想做什么。您的
memcpy
会将所有字节复制到byteData
缓冲区,只有当您尝试将byteData缓冲区用作字符串(char*
)并将其传递到格式化函数(NSLog(%%%s),val)
)时,它才会被切断。如果希望数据的字符串表示形式为十六进制:
NSString* bytesToHex(Byte* bytes, NSUInteger count) {
NSMutableString *hex = [NSMutableString string];
for(int i = 0; i < count; i++) [hex appendFormat:@"%.2x " , *(bytes+i)];
return hex;
}
NSString* dataToHex(NSData* data) {
return bytesToHex((Byte*)data.bytes, data.length);
}
将打印:
74 00 68 00 69 00 73 00 20 69 00 73 00 20 61 00 20 74 00 65 00 73 74 00
74 00 68 00 69 00 73 00 20 69 00 73 00 20 61 00 20 74 00 65 00 73 74 00
或
将打印:
74 00 68 00 69 00 73 00 20 69 00 73 00 20 61 00 20 74 00 65 00 73 74 00
74 00 68 00 69 00 73 00 20 69 00 73 00 20 61 00 20 74 00 65 00 73 74 00
刚刚想起了什么
更简单的是,如果您使用NSData description属性,它将以十六进制格式提供数据
Byte* bytes = (Byte*)"t\0h\0i\0s\0 i\0s\0 a\0 t\0e\0st";
NSData* data = [NSData dataWithBytes:bytes length:24];
NSLog(@"%@", data.description);
将打印
<74006800 69007300 20690073 00206100 20740065 00737400>
不是很漂亮,但同样的事情…我不太明白,
'\0'
是0x00
hex的字符,也就是NULL。试试这个NSLog(@“%.2x”,'\0')代码>,它所做的只是转换为十六进制“\0”并记录,您将看到它们是相同的。更有趣的是,NSLog(@“%.2x%.2x%.2x”、'\0',0x00,0)代码>是,但我需要字节数组继续,而不是在\0处停止。我猜字节数组将继续,只是当您尝试将其打印为字符串时,它不会。。。