簡體   English   中英

將字節反轉的uint64_t復制到uint8_t數組

[英]copy byte-reversed uint64_t to uint8_t array

我知道如何反轉字節順序( 在C中將big endian轉換為little endian [不使用提供的func] )-在這種情況下,我想使用__builtin_bswap64

我也知道如何將64位uint復制到char數組-理想地是memcopy。 如何將64位整數轉換為char數組並返回?

我的問題是這兩者的結合。 問題的根源在於,我試圖找到一種更快的替代方法:

carr[33] = ((some64bitvalue >> 56) & 0xFF) ;
carr[34] = ((some64bitvalue >> 48) & 0xFF) ;
carr[35] = ((some64bitvalue >> 40) & 0xFF) ;
carr[36] = ((some64bitvalue >> 32) & 0xFF) ;
carr[37] = ((some64bitvalue >> 24) & 0xFF) ;
carr[38] = ((some64bitvalue >> 16) & 0xFF) ;
carr[39] = ((some64bitvalue >> 8) & 0xFF) ;
carr[40] = (some64bitvalue & 0XFF);

由於memcopy不會將__builtin_bswap64的結果作為源參數(還是這樣做?),因此我嘗試了以下操作:

*(uint64_t *)upub+33 = __builtin_bswap64(some64bitvalue);

但我最終遇到錯誤:左值必須作為賦值的左操作數

是否有比我嘗試替換的原始代碼更快的替代方法?

這個:

*(uint64_t *)upub+33 = __builtin_bswap64(PplusQ[di][3]);

解析為

(*(uint64_t *) upub) + 33 = __builtin_bswap64(PplusQ[di][3]);

因此左側是uint64_t而不是左值。

這樣可以嗎?

*(uint64_t *) (upub+33) = __builtin_bswap64(PplusQ[di][3]);

還是您要upub空加瓜所說的那樣upubuint64_t *

*((uint64_t *) upub + 33) = __builtin_bswap64(PplusQ[di][3]);

我沒有看到提到的upub類型,所以我無法分辨。

另外,我感覺如果upub最初指向另一種類型,則別名規則可能會出現問題,因此您可能要使用gcc的-fno-strict-aliasing類的東西,或者通過並集進行賦值,或者如您的第一個代碼段中所示,一次寫入一個字節。

您可以復制為:

uint64_t tmp = __builtin_bswap64(some64bitvalue);
memcpy(upub+33,&tmp,sizeof(tmp));

假設upub是指針變量

在編寫與字節序無關的代碼時,除了移位以外別無選擇。 您的代碼可能已經接近理想。

您可以使用的是循環而不是硬編碼的數字。 與此類似:

for(uint_fast8_t i=0; i<8; i++)
{
  carr[i+offset] = (some64bitvalue >> (56-(i*8)) & 0xFF;
}

與您現有的設備相比,這可能變得更慢,更快或相等,具體取決於系統。 總體而言,在不考慮特定系統的情況下討論這樣的手動優化毫無意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM