假设我有8个unsigned char,我想转换为unsigned long long。
例如,如果所有char都等于0xFF,则无符号long long将等于0xFFFFFFFFFFFFFFFF。
使用C或C ++最有效的方法是什么?
例如:
unsigned char buffer[8] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; unsigned long long target; memcpy(&target, buffer, sizeof target);
请注意,如果不是buffer
所有元素都具有相同的值,则结果将取决于字节顺序(little-endian与big-endian)。
这也假设unsigned long long
恰好是8个字节。 这是非常普遍的,但并不能保证。 (它也不能保证一个字节正好是8位;它可以更多。 unsigned char
定义为1字节。)
您可以直接分配位,而不是memcpy
unsigned char buffer[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; unsigned long long l = 0; for (int i = 0; i < 8; ++i) { l = l | ((unsigned long long)buffer[i] << (8 * i)); }
我相信这对endianness是免疫的。
抱歉我最初的愚蠢回答,真的应该更仔细地阅读这个问题。 希望这个更有帮助。 转换的方式取决于字节数组中长long表示的字节顺序是否与您正在处理的体系结构的字节顺序相匹配。
C ++:
#include #include using namespace std; // Assuming ca is at least 8 bytes, the size of long long, interpret the // first 8 bytes as long long. // differentEndian == true means the endianness of the machine is // different from the representation in ca. long long getLongLong( unsigned char * ca, bool differentEndian ) { long long retVal; if (differentEndian) { for (int i = 0; i < 4; i++) { unsigned char _tmpCh = ca[i]; ca[i] = ca[7-i]; ca[7-i] = _tmpCh; } } retVal = *reinterpret_cast(ca); return retVal; } int main() { unsigned char cArray[] = {0xff, 0x1, 0x70, 0x2, 0x61, 0x3, 0x52, 0x4}; unsigned long long ll = getLongLong( cArray, false ); cout << "Result for same endian: " << hex << ll << " or " << dec << ll << endl; ll = getLongLong( cArray, true ); cout << "Result for different endian: " << hex << ll << " or " << dec << ll << endl; return 0; }
C:
#include #include // Assuming ca is at least 8 bytes, the size of long long, interpret the // first 8 bytes as long long. // differentEndian != 0 means the endianness of the machine is // different from the representation in ca. long long getLongLong( unsigned char * ca, int differentEndian ) { long long retVal; if (differentEndian) { int i; for (i = 0; i < 4; i++) { unsigned char _tmpCh = ca[i]; ca[i] = ca[7-i]; ca[7-i] = _tmpCh; } } memcpy( &retVal, ca, sizeof(long long)); return retVal; } int main() { unsigned char cArray[] = {0xff, 0x1, 0x70, 0x2, 0x61, 0x3, 0x52, 0x4}; unsigned long long ll = getLongLong( cArray, 0 ); printf("Result for same endian: %llx or %llun", ll, ll); ll = getLongLong( cArray, 1 ); printf("Result for different endian: %llx or %llun", ll, ll); return 0; }
两个版本的输出是:
Result for same endian: 4520361027001ff or 311315039429591551 Result for different endian: ff01700261035204 or 1837509111016818739
以上就是c/c++开发分享如何将unsigned char数组转换为unsigned long long?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560395.html