C ++在字符串表示

时间:2018-05-10 10:04:43

标签: c++ arduino type-conversion

我想转换unsigned char testData[8] = {0xFF,0xF0,0x00,0xA0,0x00,0x00,0x00,0x99}; 到String(Arduino变量类型)

目前我试试这个:

  std::string str( reinterpret_cast<char*>(testData), 8);
  // std::string str( testData, testData + sizeof testData / sizeof testData[0] );
  String message = String(str.c_str());

但是返回char值的asci字符,这是有道理的。但我想要实现的是将数组中的所有位(8x8)解释为long long(64位int)并将此数值转换为其字符串表示形式。我想实现这一点,所以我可以用JSON将它发送到我的nodejs服务器(它不支持64位,所以我可能需要切两个)。

例如,如果我有:{0xFF,0xF0,0x00,0xA0,0x00,0x00,0x00,0x99} 例如,它的长期价值是:9894736399534 然后我想找回&#34; 9894736399534&#34;在我的String对象中。

2 个答案:

答案 0 :(得分:1)

正如其他人所指出的,您所要做的就是将原始数据解释为(unsigned)long long,然后将该值存储在字符串中,例如:

#include <iostream>
#include <sstream>
#include <cstdlib>

int main(void)
{
    unsigned char testData[8] = {0xFF,0xF0,0x00,0xA0,0x00,0x00,0x00,0x99};
    unsigned long long data = *reinterpret_cast<unsigned long long*>(testData);

    std::stringstream str;
    //str << std::hex << data;
    str << data;

    std::cout << str.str() << '\n';

    return EXIT_SUCCESS;
}

修改

以下解决方案依赖于String构造函数将原始64位值转换为2个32位值表示形式,如果需要,可以将它们连接或单独使用。 这假设平台是小端的。

String lsdw = String(*reinterpret_cast<unsigned long*>(&testData[0]), HEX);
String msdw = String(*reinterpret_cast<unsigned long*>(&testData[4]), HEX);
String message = lsdw + msdw;

答案 1 :(得分:0)

首先需要将内存重新解释为64位int指针,然后根据该内存区域中的数字创建一个字符串。

所以将char*转换为unsigned long long*,然后取消引用它并创建一个字符串。

此代码应该有效。

    unsigned long long number = *(reinterpret_cast<unsigned long long *>(testData))
    std::string stringNum = std::to_string(number);