2009-02-25 12 views
9
typedef unsigned char Byte; 

... 

void ReverseBytes(void *start, int size) 
{ 
    Byte *buffer = (Byte *)(start); 

    for(int i = 0; i < size/2; i++) { 
     std::swap(buffer[i], buffer[size - i - 1]); 
    } 
} 

このメソッドが現在行っていることは、メモリ内のバイトを反転させることです。私が知りたいことは、同じ効果を得る良い方法があるということです。 「サイズ/ 2」の部分全体が悪いもののように見えますが、わかりません。メモリ内のバイト配列を逆転させるより良い方法はありますか?

編集:私は、この質問のためにタイトルを付けたのが悪かったことを認識したので、うまくいけばそれを修正しました。

+0

あなたの例に欠陥があるようですが、場所を指定せずに2つの文字をどうやって入れ替えることができますか?私はあなたがアドレスを渡す必要があると思う。 – leppie

答えて

23

標準ライブラリはstd::reverse機能を持っています

#include <algorithm> 
void ReverseBytes(void *start, int size) 
{ 
    char *istart = start, *iend = istart + size; 
    std::reverse(istart, iend); 
} 
+0

ありがとうございます。私はそれを自分で書く前にそれを調べておくべきだった。 – xian

+0

リバース機能の説明は、質問をした人がそれを実装した方法とまったく同じ方法で実装されており、同じ複雑さを持っていると述べています。それは本当に良い方法ではありません。おそらく最高のクリーンな方法.. – Julius

1

あなたは逆にする必要がある場合は、あなたのアルゴリズムを改善し、ちょうど逆イテレータを使用することができる可能性があります。

+0

これは、異なるエンディアンを使用するファイルからデータを読み取るためのものです。 – xian

+0

@kitchenこれは、配列全体のバイトではなく、整数のバイトを逆転するような感じです... –

1

endiannessが異なるファイルからバイナリデータを取り消す場合は、ntoh *とhton *関数を使用することをお勧めします.ntoh *関数とhton *関数は、指定されたデータサイズをネットワークからホストへ、またはその逆に変換します。 ntohlはビッグエンディアン(ネットワークオーダー)からホストオーダー(x86マシンではリトルエンディアン)に32ビットの符号なしlongを変換します。

+0

この質問は配列のスワッピングに関係しているので、上で提供された解決策は必要以上に答えています。 – Xofo

0

私はstl :: swapを見直し、最適化されていることを確認します。その後、私はあなたがスペースに最適だと言いたいと思います。私は合理的にそれが時間最適であることも合理的です。

+0

どこでも最適な時間はありません。 'size/2'計算*はすべてのループで実行されるように最適化されるかもしれませんが、' size-i-1'計算はできませんし、配列インデックスのコストもかかりません。 完全に最適化されたループは、彼が得たものよりはるかに高速ではありません。 –

+0

それは私がそれを言うのを引き起こした "それほど*それ*高速です"です... –

17

STLを使用することなく、パフォーマンスのソリューション:

void reverseBytes(void *start, int size) { 
    unsigned char *lo = start; 
    unsigned char *hi = start + size - 1; 
    unsigned char swap; 
    while (lo < hi) { 
     swap = *lo; 
     *lo++ = *hi; 
     *hi-- = swap; 
    } 
} 

質問は3½歳ですが、チャンスは他の誰かが同じことを探しされることがあります。それが私がまだ投稿している理由です。

+5

チャンスは実現しました:) –

関連する問題