本文主要是介绍2312d,原始写,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
原文
我正在重建一些从C++
到D的代码:
import std.stdio;
import std.file;
import std.string;
import std.math;
struct WavHeader {char[4] riff;int flength;char[4] wave;char[4] fmt;int chunk_size;short format_tag;short num_chans;int sample_rate;int bytes_per_second;short bytes_per_sample;short bits_per_sample;char[4] data;int dlength;
}
void main() {WavHeader wahv;wahv.riff[] = "RIFF".dup;wahv.wave[] = "WAVE".dup;wahv.fmt[] = "fmt ".dup;wahv.data[] = "data".dup;wahv.chunk_size = 16;wahv.format_tag = 1;wahv.num_chans = 1;wahv.sample_rate = 8000;wahv.bits_per_sample = 16;wahv.bytes_per_sample = cast(short)((wahv.bits_per_sample / 8) * wahv.num_chans);wahv.bytes_per_second = wahv.sample_rate * wahv.bytes_per_sample;const int duration_seconds = 10;const int buffer_size = wahv.sample_rate * duration_seconds;wahv.dlength = buffer_size * wahv.bytes_per_sample;wahv.flength = wahv.dlength + 44;short[] buffer = new short[buffer_size];foreach (i; 0 .. buffer_size) {buffer[i] = cast(short)(cos((2.0 * PI * 256.0 * i) / wahv.sample_rate) * 1000);}//更正了文件处理auto file = File("test.wav", "r");file.rawWrite(wahv);//按原始字节写音频数据file.rawWrite(cast(ubyte[])buffer);file.close();
}
因为我对这些话题
有些陌生,对Dlang
更是如此,所以我不太了解.问题在创建.wav
时,关于rawWrite
,我不确定该怎么办?
因为WaveHeader
中没有指针
,只有原始内存
,假设它都在cpu
小头中,且使用''align(1)''
,你可切片栈内存块
,并从中写入.
file.rawWrite((cast(ubyte*)&wahv)[0 .. WaveHeader.sizeof]);
但是,我建议按字段
写.
更多工作,但允许你处理字节序
问题并消除对齐
问题.如果需要,还可更改字段大小
.
原则与上述代码相同.
错误消息说的是,你试传递WavHeader
给rawWrite
,但rawWrite
需要一个切片(T[]
,T为类型
)参数.
解决的最简单方法是使用指针切片来创建wavh
的临时切片
:
file.rawWrite((&wahv)[0 .. 1]);
这篇关于2312d,原始写的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!