将字符串连接到unsigned long,保持固定的维度结果

时间:2016-05-14 20:45:00

标签: arduino

我有一个令牌存储为十六进制数字的字符串表示形式:

String tokenStored = "ABCD1234ABABFFFF";

我还有一个无符号长号如下:

unsigned long noun = 12345;

我需要连接 tokenStored + 名词并且具有固定长度的char数组结果,但我无法决定如何以优雅的方式处理问题。我想出了这个可能的解决方案:

tokenStored 保留为String,然后将名词从十进制转换为十六进制,再转换为字符串。用“0”填充结果字符串的剩余空格(如果有)以使长度始终为8个字符,因此12345将为0x3039,然后是“3039”,然后是“00003039”。这样我可以连接并拥有“ABCD1234ABABFFFF00003039”,始终固定为24个字符。这个解决方案将涉及掩蔽,我不是专家。您如何看待这种方法,请提供示例。

1 个答案:

答案 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的正确说明符(如果你改变了类型,你也必须更改说明符)并且它不会起作用原始类型。