- PR -

float, double型のエンディアン変換

1
投稿者投稿内容
ishisaka
常連さん
会議室デビュー日: 2001/10/10
投稿数: 23
投稿日時: 2003-04-30 22:38
 整数型のエンディアン変換はフレームワークに用意されていますが、floatやdouble型などでは変換用のクラスやメソッドは用意されていません。これらのエンディアン変換は皆さんどのようにされていますか?
 アンマネージドなCやC++では
コード:
inline void bswap( double& d ){
  double s=d;
  char *ps((char*)&s), *pd((char*)&d);

  pd[0] = ps[7];
  pd[1] = ps[6];
  pd[2] = ps[5];
  pd[3] = ps[4];
  pd[4] = ps[3];
  pd[5] = ps[2];
  pd[6] = ps[1];
  pd[7] = ps[0];
}


のような感じで、ポインタを使えばそんなに難しい話ではないのですが、マネージドな世界ではC#でunsafeを使って同じようにやらないと無理かなぁとか思ってしまうのですが、unsafeを使わないで何か良い解決方法を見つけた方はいらっしゃいますか?

_________________
いしさかただひろ(*^^)v
Valhalla
ベテラン
会議室デビュー日: 2002/09/03
投稿数: 53
投稿日時: 2003-05-02 02:26
エンディアン変換というのはやったことないですが、

BitConverterクラスの

public static byte[] GetBytes(double); と

public static double ToDouble(
byte[] value,
int startIndex
);


はだめですか?
ishisaka
常連さん
会議室デビュー日: 2001/10/10
投稿数: 23
投稿日時: 2003-05-02 08:33
BitConverterクラスですか、気づきませんでした。ありがとうございます。
そこでこのクラスを使うとこんな感じになります
コード:
public byte[] bsawp(double d)
{
	byte[] s;
	byte[] D;
	D = BitConverter.GetBytes(d);
	s = new byte[8];
	s[0] = D[7];
	s[1] = D[6];
	s[2] = D[5];
	s[3] = D[4];
	s[4] = D[3];
	s[5] = D[2];
	s[6] = D[1];
	s[7] = D[0];
	return s;
}


GetByteメソッドと、ToHogeメソッドにエンディアンを指定する引数を持った物もほしいですね。
_________________
いしさかただひろ(*^^)v
Izumi, Y.
ベテラン
会議室デビュー日: 2002/03/19
投稿数: 77
お住まい・勤務地: 東京
投稿日時: 2003-05-03 14:02
引用:

GetByteメソッドと、ToHogeメソッドにエンディアンを指定する引数を持った物もほしいですね。


ないものは仕方がないので、自分で作ってライブラリにしておくといいと思います。
コード:
using System;

public enum Endian { Little, Big }

public sealed class MyConverter {
  public static byte[] GetBytes(double d, Endian endian) {
    byte[] work;
    work = BitConverter.GetBytes(d);
    if(BitConverter.IsLittleEndian ^ endian == Endian.Little)
      Array.Reverse(work);
    return work;
  }
  public static double ToDouble(byte[] b, Endian endian) {
    byte[] work = b.Clone();
    if(BitConverter.IsLittleEndian ^ endian == Endian.Little)
      Array.Reverse(work);
    return BitConverter.ToDouble(work);
  }
}


1

スキルアップ/キャリアアップ(JOB@IT)