public static void Main()
var riffHeader = RiffHelper.BuildHeader(0, RiffHelper.Channels.One, RiffHelper.SampleRate.Khz8, RiffHelper.SampleSize.Bit8, RiffHelper.Format.MuLaw);
Console.WriteLine("RIFF Header Hex:");
Console.WriteLine(BitConverter.ToString(riffHeader));
public static class RiffHelper
public static byte[] BuildHeader(int audioDataLengthBytes, Channels channels, SampleRate sampleRate, SampleSize sampleSize, Format format)
return BuildHeader(audioDataLengthBytes, (short)channels, (int)sampleRate, (short)sampleSize, (short)format);
public static byte[] BuildHeader(int audioDataLengthBytes, short channels, int sampleRate, short sampleSizeBits, short formatCode)
Console.WriteLine("Building header");
var header = new byte[44];
Encoding.UTF8.GetBytes("RIFF".ToCharArray()).CopyTo(header, 0);
BitConverter.GetBytes((int)(audioDataLengthBytes + 44 - 8)).CopyTo(header, 4);
Encoding.UTF8.GetBytes("WAVEfmt ".ToCharArray()).CopyTo(header, 8);
BitConverter.GetBytes((int)16).CopyTo(header, 16);
BitConverter.GetBytes(formatCode).CopyTo(header, 20);
BitConverter.GetBytes(channels).CopyTo(header, 22);
BitConverter.GetBytes(sampleRate).CopyTo(header, 24);
BitConverter.GetBytes((int)channels * sampleRate * (sampleSizeBits / 8)).CopyTo(header, 28);
BitConverter.GetBytes((short)channels * (sampleSizeBits / 8)).CopyTo(header, 32);
BitConverter.GetBytes(sampleSizeBits).CopyTo(header, 34);
Encoding.UTF8.GetBytes("data".ToCharArray()).CopyTo(header, 36);
BitConverter.GetBytes(audioDataLengthBytes).CopyTo(header, 40);
public static void ReadHeader(byte[] data, out short channels, out int sampleRate, out short sampleSizeBits, out short formatCode)
throw new Exception("Invalid header data! Need at least 44 bytes!");
if (Encoding.UTF8.GetString(data.Take(4).ToArray()) != "RIFF")
throw new Exception("Invalid header data! Not RIFF!");
channels = BitConverter.ToInt16(data.Skip(22).Take(2).ToArray(), 0);
sampleRate = BitConverter.ToInt32(data.Skip(24).Take(4).ToArray(), 0);
sampleSizeBits = BitConverter.ToInt16(data.Skip(34).Take(2).ToArray(), 0);
formatCode = BitConverter.ToInt16(data.Skip(20).Take(2).ToArray(), 0);