如何将 AVAudioRecorder 给出的数据重新解释为 const char *?
How to reinterpret data given by AVAudioRecorder as const char *?
问题:
我要解决的问题如下。我有 AVAudioRecorder 录制的音频数据。我可以通过以下方式获取 NSData:
NSData *data = [NSData dataWithContentsOfURL: self.audioRecorder.url];
但是我需要 convert/reinterpret 将这个 NSData 转换为 const char* 形式,它基本上看起来像
00 01 00 ff
它们是十六进制的字节或至少是等效的字符串。它们不必实际上是十六进制的,而只需要可转换为十六进制即可。
问题:
我的问题是 NSData 中有“\0”。所以如果我这样做:
NSUInteger len = [data length];
Byte *byteData = (Byte*)malloc(len);
memcpy(byteData, [data bytes], len);
因为数据遇到第一个"\0"会被截断,所以不行。我对音频文件非常陌生,但我认为这是因为 header 中的 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);
}
会做,即:
Byte* bytes = (Byte*)"t[=11=]h[=11=]i[=11=]s[=11=] i[=11=]s[=11=] a[=11=] t[=11=]e[=11=]st";
NSData* data = [NSData dataWithBytes:bytes length:24];
NSLog(@"%@",NSLog(@"%@", dataToHex(data));
将打印:
74 00 68 00 69 00 73 00 20 69 00 73 00 20 61 00 20 74 00 65 00 73 74 00
或
Byte* bytes = (Byte*)"t[=13=]h[=13=]i[=13=]s[=13=] i[=13=]s[=13=] a[=13=] t[=13=]e[=13=]st";
NSData* data = [NSData dataWithBytes:bytes length:24];
NSUInteger len = [data length];
Byte *byteData = (Byte*)malloc(len);
memcpy(byteData, [data bytes], len);
NSLog(@"%@", bytesToHex(byteData, len));
将打印:
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 描述 属性,它已经为您提供了十六进制数据!
Byte* bytes = (Byte*)"t[=15=]h[=15=]i[=15=]s[=15=] i[=15=]s[=15=] a[=15=] t[=15=]e[=15=]st";
NSData* data = [NSData dataWithBytes:bytes length:24];
NSLog(@"%@", data.description);
将打印
<74006800 69007300 20690073 00206100 20740065 00737400>
没那么漂亮,但一样...
问题:
我要解决的问题如下。我有 AVAudioRecorder 录制的音频数据。我可以通过以下方式获取 NSData:
NSData *data = [NSData dataWithContentsOfURL: self.audioRecorder.url];
但是我需要 convert/reinterpret 将这个 NSData 转换为 const char* 形式,它基本上看起来像
00 01 00 ff
它们是十六进制的字节或至少是等效的字符串。它们不必实际上是十六进制的,而只需要可转换为十六进制即可。
问题:
我的问题是 NSData 中有“\0”。所以如果我这样做:
NSUInteger len = [data length];
Byte *byteData = (Byte*)malloc(len);
memcpy(byteData, [data bytes], len);
因为数据遇到第一个"\0"会被截断,所以不行。我对音频文件非常陌生,但我认为这是因为 header 中的 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);
}
会做,即:
Byte* bytes = (Byte*)"t[=11=]h[=11=]i[=11=]s[=11=] i[=11=]s[=11=] a[=11=] t[=11=]e[=11=]st";
NSData* data = [NSData dataWithBytes:bytes length:24];
NSLog(@"%@",NSLog(@"%@", dataToHex(data));
将打印:
74 00 68 00 69 00 73 00 20 69 00 73 00 20 61 00 20 74 00 65 00 73 74 00
或
Byte* bytes = (Byte*)"t[=13=]h[=13=]i[=13=]s[=13=] i[=13=]s[=13=] a[=13=] t[=13=]e[=13=]st";
NSData* data = [NSData dataWithBytes:bytes length:24];
NSUInteger len = [data length];
Byte *byteData = (Byte*)malloc(len);
memcpy(byteData, [data bytes], len);
NSLog(@"%@", bytesToHex(byteData, len));
将打印:
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 描述 属性,它已经为您提供了十六进制数据!
Byte* bytes = (Byte*)"t[=15=]h[=15=]i[=15=]s[=15=] i[=15=]s[=15=] a[=15=] t[=15=]e[=15=]st";
NSData* data = [NSData dataWithBytes:bytes length:24];
NSLog(@"%@", data.description);
将打印
<74006800 69007300 20690073 00206100 20740065 00737400>
没那么漂亮,但一样...