我想將四個字符的字符串(即四個字符)轉換爲長整型(即將它們轉換爲ASCII碼,然後將它們放入長整型中)。將四個字符的字符串轉換爲長整數
據我所知,這是通過將第一個字符寫入長字的第一個字節,將第二個字寫入相鄰的存儲單元,等等來完成的。但我不知道如何在C++中做到這一點。
有人可以請指出我在正確的方向嗎?
在此先感謝。
我想將四個字符的字符串(即四個字符)轉換爲長整型(即將它們轉換爲ASCII碼,然後將它們放入長整型中)。將四個字符的字符串轉換爲長整數
據我所知,這是通過將第一個字符寫入長字的第一個字節,將第二個字寫入相鄰的存儲單元,等等來完成的。但我不知道如何在C++中做到這一點。
有人可以請指出我在正確的方向嗎?
在此先感謝。
這是你的四個字符集:
const unsigned char buf[4] = { 'a', '0', '%', 'Q' };
現在我們組裝一臺32位無符號整數:
const uint32_t n = (buf[0]) | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
在這裏,我認爲buf[0]
是最顯著之一;如果你想換個角度,只需交換指數。
讓我們確認:
printf("n = 0x%08X\n", n); // we get n = 0x51253061
// Q % 0 a
重要:確保您的原始字節的緩衝區是簽名,或以其他方式添加顯式轉換像(unsigned int)(unsigned char)(buf[i])
;否則轉換操作沒有明確定義。
字警告:我強烈希望在可能的誘人const uint32_t n = *(uint32_t*)(buf)
這個代數解,這是機器字節順序依賴,將讓你的編譯器生氣,如果你使用嚴格別名假設!
正如有益指出的下方,你可以嘗試通過在字節的位大小不做假設更加便攜:在需要
const unsigned very long int n = buf[0] |
(buf[1] << (CHAR_BIT) |
(buf[2] << (CHAR_BIT * 2) |
(buf[3] << (CHAR_BIT * 3) ;
隨意編寫自己的概括! (祝你好運找出適當的printf
格式字符串;-))
請確保'CHAR_BIT'是'8'! – 2011-06-16 11:35:29
再一次你說'CHAR_BIT',我會來破解你的大腦;-) – 2011-06-16 11:37:20
Teehee。我會滿足於'assert(CHAR_BIT == 8)'的答案。 – 2011-06-16 11:56:14
如果你的字節是正確的順序爲您的機器上很長,然後使用memcpy,這樣的事情 -
#include <cstdlib>
#include <iostream>
int main()
{
char data[] = {'a', 'b', 'c', 'd'};
long result;
std::memcpy(&result, data, 4);
std::cout << result << "\n";
}
注意這將是平臺依賴於字節排序的長期內可能或可能不是你所需要的。並且4被硬編碼爲長整型字節的大小。你當然不會在真正的程序中硬編碼4。我試過的所有編譯器都在優化啓用時優化了memcpy,所以它可能也很有效。
編輯:與轉變並添加回答別人張貼的答案,除非這符合您的具體要求,因爲它更便攜和安全!
#include <string>
#include <iostream>
std::string fourCharCode_toString (int value)
{
return std::string(reinterpret_cast<const char*>(&(value)), sizeof(int));
}
int fourCharCode_toInt (const std::string & value)
{
return *(reinterpret_cast<const int*>(value.data()));
}
int main()
{
int a = 'DROW';
std::string str = fourCharCode_toString(a);
int b = fourCharCode_toInt(str);
std::cout << str << "\n";
}
是串像「1234」,和你想要的值'1234',或者是「甘草黃酮^%」,只是想和你的字符代碼解釋爲字節長? – 2011-06-16 11:20:31
如果您想將字符串解析爲長整型值,請使用'strtol'。 (http://www.cplusplus.com/reference/clibrary/cstdlib/strtol/) – 2011-06-16 11:23:48