什么地方不用二进制储存数据
时间: 2024-04-01 12:32:37 浏览: 21
在计算机内部,所有数据都是以二进制形式存储和处理的。但在计算机与外界交互的过程中,数据可能以不同的形式呈现。例如,在图形用户界面(GUI)中,文本和图像等数据通常以人类能够理解的形式呈现,而不是二进制形式。在网络传输过程中,数据也通常以不同的协议和格式进行编码和解码。但是,这些数据在计算机内部进行处理和存储时,仍然需要转换为二进制形式进行处理。因此,可以说,计算机内部所有数据都是以二进制形式存储和处理的。
相关问题
c++ opencv mat转二进制数据流
将OpenCV的Mat对象转换为二进制数据流可以使用以下代码:
```c++
cv::Mat image; // 假设有一个Mat对象
std::vector<uchar> buffer; // 存储二进制数据流的向量
// 将Mat对象转换为二进制数据流
cv::imencode(".jpg", image, buffer);
// 现在,可以将buffer中的数据流写入文件或通过网络发送
```
在这个代码中,`cv::imencode()`函数将Mat对象转换为指定格式的二进制数据流,并将其存储在一个`std::vector<uchar>`类型的向量中。在这里,我们使用`.jpg`格式,但是你可以使用其他格式,比如`.png`、`.bmp`等。
然后,你可以将这个向量中的数据流写入文件或通过网络发送到其他地方。例如,你可以使用`std::ofstream`类将数据流写入文件:
```c++
std::ofstream output_file("image.jpg", std::ios::binary);
output_file.write((const char*)buffer.data(), buffer.size());
output_file.close();
```
在这个例子中,我们创建了一个名为`image.jpg`的文件,并使用`std::ios::binary`标志打开文件,以便在写入数据时不进行文本模式转换。`output_file.write()`函数将向量中的二进制数据流写入文件,然后关闭文件句柄。
c++将实时接收的pcm二进制裸数据保存为wav格式
要将实时接收的PCM二进制裸数据保存为WAV格式,你可以按照以下步骤进行操作:
1. 创建WAV文件头
WAV文件头由44个字节组成,其中包含了WAV文件的各种信息,如采样率、声道数、位深度等。你需要先创建一个WAV文件头,并填入相应的信息。
```c++
// 定义WAV文件头结构体
#pragma pack(push, 1) // 按字节对齐
struct WAVHeader {
// RIFF 头
uint8_t riff[4] = {'R', 'I', 'F', 'F'}; // RIFF 标志
uint32_t size; // 文件总大小(不包含RIFF头)
uint8_t wave[4] = {'W', 'A', 'V', 'E'}; // WAVE 标志
// fmt 子块
uint8_t fmt[4] = {'f', 'm', 't', ' '}; // fmt 标志
uint32_t fmt_size = 16; // fmt 子块大小
uint16_t audio_format = 1; // 音频格式
uint16_t num_channels; // 声道数
uint32_t sample_rate; // 采样率
uint32_t byte_rate; // 每秒字节数
uint16_t block_align; // 数据块对齐
uint16_t bits_per_sample; // 位深度
// data 子块
uint8_t data[4] = {'d', 'a', 't', 'a'}; // data 标志
uint32_t data_size; // 数据大小
};
#pragma pack(pop) // 恢复默认对齐方式
```
在上面的代码中,我们定义了一个WAVHeader结构体,用于存储WAV文件头的信息。其中,num_channels表示声道数,sample_rate表示采样率,bits_per_sample表示位深度。
2. 将PCM数据写入WAV文件
将实时接收的PCM二进制裸数据写入WAV文件时,需要按照以下步骤操作:
- 打开WAV文件并写入文件头
- 按照WAV文件头中的信息,计算每秒字节数和数据块对齐
- 按照WAV文件头中的信息,计算数据区大小,并将其写入文件头
- 逐个样本地将PCM数据写入文件
下面是一个示例代码:
```c++
#include <fstream>
#include <iostream>
// 写入WAV文件
void WriteWavFile(const std::string& filename, const char* buffer, int buffer_size, int num_channels, int sample_rate, int bits_per_sample) {
// 打开WAV文件
std::ofstream file(filename, std::ios::binary);
if (!file.is_open()) {
std::cerr << "Failed to open file: " << filename << std::endl;
return;
}
// 创建WAV文件头
WAVHeader header;
header.num_channels = num_channels;
header.sample_rate = sample_rate;
header.bits_per_sample = bits_per_sample;
header.byte_rate = sample_rate * num_channels * bits_per_sample / 8;
header.block_align = num_channels * bits_per_sample / 8;
header.data_size = buffer_size;
header.size = 36 + buffer_size;
// 写入WAV文件头
file.write(reinterpret_cast<char*>(&header), sizeof(header));
// 写入PCM数据
file.write(buffer, buffer_size);
// 关闭文件
file.close();
}
int main() {
// 假设我们从某个地方实时接收到了PCM数据
const char* pcm_data = nullptr; // PCM数据指针
int pcm_size = 0; // PCM数据大小
// 将PCM数据保存为WAV格式
WriteWavFile("output.wav", pcm_data, pcm_size, 1, 16000, 16);
return 0;
}
```
上面的代码中,我们将实时接收到的PCM数据保存为了名为output.wav的WAV文件。在调用WriteWavFile函数时,需要传入PCM数据指针、PCM数据大小、声道数、采样率以及位深度等参数。函数会自动计算出每秒字节数、数据区大小等信息,并将它们写入WAV文件头。最后,函数会将PCM数据写入文件。