エンディアン問題を解決するクラステンプレート
ライブラリ
endian.h
コピー&ペーストしてください
簡単説明
#define __int16 short
#define __int32 int
と定義して__int16を使えるようにする
C++Builder 等ではすでに定義済みなのでいらない
このライブラリを include
#include "endian.h"
今までこのように書いていたプログラムを変更
このように宣言を変更する
unsigned int fileSize;
↓
L_endian<unsigned __int32> fileSize;
構造体でも同じように
struct WAVE_HEADER{
char riff[4]; // 'RIFF'
unsigned int fileSize; // ファイルサイズ − 8
char wavefmt[8]; // 'WAVEfmt '
unsigned int headerSize; // ヘッダのサイズ
unsigned short category; // PCMの種類
unsigned short channel; // PCMチャネル数
unsigned int rate; // サンプリングレート
unsigned int bps; // byte per sec
unsigned short bpb; // byte per block
unsigned short bit; // サンプリングビット数
char data[4]; //String_n<4> data; // 'data'
unsigned int dataSize; // データのサイズ
};
↓
struct WAVE_HEADER{
char riff[4]; //String_n<4> riff; // 'RIFF'
L_endian<unsigned __int32> fileSize; // ファイルサイズ − 8
char wavefmt[8]; // 'WAVEfmt '
L_endian<unsigned __int32> headerSize; // ヘッダのサイズ
L_endian<unsigned __int16> category; // PCMの種類
L_endian<unsigned __int16> channel; // PCMチャネル数
L_endian<unsigned __int32> rate; // サンプリングレート
L_endian<unsigned __int32> bps; // byte per sec
L_endian<unsigned __int16> bpb; // byte per block
L_endian<unsigned __int16> bit; // サンプリングビット数
char data[4]; // 'data'
L_endian<unsigned __int32> dataSize; // データのサイズ
};
L_endian<unsigned __int32> fileSize=0x12345678; //メモリ上に78 56 34 12と書き込まれる
以上終わり
/////////////////////////////////////////////////////////////
サンプルプログラム
10秒のwavファイルを作成
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>
#ifdef __BCPLUSPLUS__
//C++Builder定義済み
#elif _MSC_VER //MS系コンパイラのデフォルトマクロ
//MS系コンパイラ定義済み
#elif __GNUC__ //gcc系コンパイラのデフォルトマクロ
#define __int16 short
#define __int32 int
#define __int64 long long
#else //仕方がないのでやるしかない
#define __int16 short
#define __int32 int
#endif
#include "endian.h"
#include "wave.h"
using namespace std;
int main()
{
//10秒のwavファイルを作成
ofstream ofstream_("test.wav");
WAVE_HEADER WAVE_HEADER_;
WAVE_HEADER_.__channel(2); //ステレオ
WAVE_HEADER_.__rate(44100); //サンプリング周波数44.1khz
vector< L_endian<__int16> > vec(WAVE_HEADER_.rate*WAVE_HEADER_.channel*10); //10秒
for(size_t i=0;i<vec.size();++i){
vec[i]=1; //メモリ上に0x0100と書き込まれる 無音波形を書き込む
//vec[i]=(__int16)(sin((double)(i%360))*256); //メモリ上にsin波形を書き込む
}
WAVE_HEADER_.__dataSize(vec.size()*sizeof(vec[0]));
ofstream_.write(reinterpret_cast<char*>(&WAVE_HEADER_),sizeof(WAVE_HEADER_));
ofstream_.write(reinterpret_cast<char*>(&vec[0]),WAVE_HEADER_.dataSize);
cout << vec.size() << "\n";
return 0;
}
ライブラリ
wave.h
コピー&ペーストしてください
//********************************************************************************************
#ifndef __wave_h__
#define __wave_h__
#include "endian.h"
#include <string.h>
struct WAVE_HEADER{
char riff[4]; //String_n<4> riff; // 'RIFF'
L_endian<unsigned __int32> fileSize; // ファイルサイズ − 8
char wavefmt[8]; //String_n<8> wavefmt; // 'WAVEfmt '
L_endian<unsigned __int32> headerSize; // ヘッダのサイズ
L_endian<unsigned __int16> category; // PCMの種類
L_endian<unsigned __int16> channel; // PCMチャネル数
L_endian<unsigned __int32> rate; // サンプリングレート
L_endian<unsigned __int32> bps; // byte per sec
L_endian<unsigned __int16> bpb; // byte per block
L_endian<unsigned __int16> bit; // サンプリングビット数
char data[4]; //String_n<4> data; // 'data'
L_endian<unsigned __int32> dataSize; // データのサイズ
WAVE_HEADER(){
strncpy(riff,"RIFF",sizeof(riff)); //riff="RIFF";
strncpy(wavefmt,"WAVEfmt ",sizeof(wavefmt)); //wavefmt="WAVEfmt ";
headerSize=16;
category=1;
strncpy(data,"data",sizeof(data)); //data="data";
fileSize=0;
channel=1;
rate=0;
bps=0;
bpb=0;
bit=16;
dataSize=0;
}
unsigned __int16 __channel(unsigned __int16 channel_){
channel=channel_;
bps=rate*bit/8*channel;
bpb=channel*bit/8;
return channel;
}
unsigned __int16 __rate(unsigned __int16 rate_){
rate=rate_;
bps=rate*bit/8*channel;
return rate;
}
unsigned __int32 __dataSize(unsigned __int32 dataSize_){
dataSize=dataSize_;
fileSize=sizeof(WAVE_HEADER)-8+dataSize;
return dataSize;
}
};
#endif
//********************************************************************************************
//wave.h 終わり
Zクリーナ の HomePage は「工事中」です。お問い合わせは、zcn@yan.jp まで。