2009-02-25 26 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

你的例子似乎有缺陷,你怎麼能交換兩個字符沒有位置?我懷疑你需要通過地址。 – leppie 2009-02-25 16:45:33

回答

23

標準庫有一個std::reverse功能:

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

謝謝。在我自己寫之前,我應該先查看它。 – xian 2009-02-25 09:20:22

+0

反向函數的描述指出,它完全按照提出問題的人實現它的方式實現,並且它具有相同的複雜性。這不是一個更好的方法。更好的方法可能是最好的.. – Julius 2013-02-15 16:23:19

1

如果你需要扭轉是有機會,你可以提高你的算法,只是使用反向迭代器。

+0

它用於從使用不同字節順序的文件讀取數據。 – xian 2009-02-25 11:14:49

+0

@kitchen,這似乎更像是顛倒整數的字節,而不是整個數組的字節...... – 2009-02-25 16:40:04

1

如果您從具有不同字節順序的文件中翻轉二進制數據,則應該使用ntoh *和hton *函數,它們將指定的數據大小從網絡轉換爲主機順序,反之亦然。例如,ntohl將32位無符號長整型從大端(網絡順序)轉換爲主機順序(x86機器上的小端)。

+0

這個問題涉及交換數組,所以上面提供的解決方案明確地回答了需求。 – Xofo 2017-05-10 17:23:00

0

我會檢查stl :: swap並確保它已經過優化;之後我會說你對空間非常適合。我相當確定這也是時間最優化的。

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年半的時候,有機會,會被別人搜索的同樣的事情。這就是爲什麼我仍然發佈這一點。

相關問題