我有一个令牌存储为十六进制数字的字符串表示形式:
String tokenStored = "ABCD1234ABABFFFF";
我还有一个无符号长号如下:
unsigned long noun = 12345;
我需要连接 tokenStored + 名词并且具有固定长度的char数组结果,但我无法决定如何以优雅的方式处理问题。我想出了这个可能的解决方案:
将 tokenStored 保留为String,然后将名词从十进制转换为十六进制,再转换为字符串。用“0”填充结果字符串的剩余空格(如果有)以使长度始终为8个字符,因此12345将为0x3039,然后是“3039”,然后是“00003039”。这样我可以连接并拥有“ABCD1234ABABFFFF00003039”,始终固定为24个字符。这个解决方案将涉及掩蔽,我不是专家。您如何看待这种方法,请提供示例。
答案 0 :(得分:1)
我认为stringstream是可行的方式 - 它与标准流(cin
/ cout
/ ifstream
)具有相同的界面:
#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
int main() {
std::string tokenStored = "ABCD1234ABABFFFF";
unsigned long noun = 12346;
std::stringstream stream;
stream << std::setfill('0') // left-pad with zeros
<< std::setw(16) // left-pad following output to 16 chars
<< tokenStored
<< std::setw(8) << std::hex << std::uppercase // now left-pad to 8
<< noun;
std::string result = stream.str(); // get stream's buffer
std::cout << result << ", length is " << result.length();
return 0;
}
另一种可能性是使用C方法并使用snprintf
这是安全且类型安全的,但看起来更短:
#include <cstdio>
#include <iostream>
#include <string>
int main() {
std::string tokenStored = "ABCD1234ABABFFFF";
unsigned long noun = 12346;
char buf[25]; // 1 extra char for null terminator
// 's' is for 'string', 'X' is for heXadecimal in upper case
// '0' means 'pad with zeros', numbers 16 and 8 are padding width
snprintf(buf, sizeof buf, "%016s%08lX", tokenStored.c_str(), noun);
std::string result = buf;
std::cout << result << ", length is " << result.length();
return 0;
}
在这里你必须担心buf
大小正确,unsigned long
的正确说明符(如果你改变了类型,你也必须更改说明符)并且它不会起作用原始类型。