Ios 如何将AVAudioRecorder提供的数据重新解释为常量字符*?

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

问题:

我试图解决的问题如下。我有AVAudioRecorder记录的音频数据。我可以通过以下方式获取NSR数据:

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处停止。我猜字节数组将继续,只是当您尝试将其打印为字符串时,它不会。。。