Istream:每个样本读取和wav格式位
istream::read and wav format bits per sample
下面是我用来读取16位和32位每个示例波的代码,工作得很好。
我的问题是,我如何读取剩余的8位无符号,24位有符号和32位float波?
读取一个16位有符号wav的样本:
short buffer;
file.read( ( char * ) &readbuffer, 2 );
读取一个32位带符号wav的示例:
int buffer;
file.read( ( char * ) &readbuffer, 4 );
您对目标机器做了一些假设。根据微软WAV格式,所有样本数据都是小端数据。您还希望各种数据类型的大小符合您的要求,但情况可能并非总是如此。
但是由于您当前的例程为您工作,我们暂时不会关注它(但您可能应该在某个时候修复这些东西)
32位float
如果我们忘记了可怕的尾字符和非标准类型大小,使用其他代码作为模板,32位浮点数情况变得相对简单:
float buffer;
file.read( ( char * ) &buffer, 4 );
这个问题更详细地讨论了从二进制源中读取浮点数。
x位unsigned
因为我们知道你的机器正确地解释了16位和32位的情况,我们可以假设它是小端序的。这意味着你可以把所有内容都读入一个unsigned int,它已经初始化为零,剩下的字节已经为你正确填充了:
unsigned int buffer = 0;
file.read( ( char * ) &buffer, 1 ); // 8bit unsigned integer
buffer = 0;
file.read( ( char * ) &buffer, 3 ); // 24bit unsigned integer
x位带符号
最后,如果读取的是有符号整数,则需要根据刚刚读取的数字的值填充缓冲区变量的剩余字节:
- 如果数字是正数,可以直接输入0
- 如果该数字为负(设置了最高有效字节的最高位),则使用xFF字节填充。
此代码适用于24位有符号整数:
long buffer;
int number_of_bytes = 3; // 24 bit signed integer
file.read( (char *) &buffer, number_of_bytes);
// Determine the padding byte
unsigned char padding_byte = 0;
if ( ((char*) &buffer)[number_of_bytes - 1] & 128) {
padding_byte = 255;
}
// Pad the data
for (int i = number_of_bytes; i < sizeof(buffer); i++) {
((char*) &buffer)[i] = padding_byte;
}
,我觉得我应该再次指出这段代码在某些机器上会失败,因为您没有检查端序。但是要解决这个问题,您需要做的就是检查运行代码的机器的端序,如果您在大端序的机器上,则颠倒字节的顺序。
相关文章:
- 如何在openssl-ecc中获取十六进制格式的私钥
- 将"打开的CV图像"中的"颜色"转换为整数格式
- TDateTime格式在C++Builder中不会更改
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 检查不带转换的扫描格式
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 是否可以从格式字符串中检索"width"
- clang格式:宏的缩进
- clang格式:禁用排序包含
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 将RGB图像保存为PPM格式
- 询问在设计我的手臂模拟器功能表示格式1
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 如何将strftime中的格式错误作为异常捕获
- 将CHW格式的浮点向量转换为cv::Mat
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 如何以叮当格式设置评论的行长?
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- Istream:每个样本读取和wav格式位