C ++ преобразует массив без знака в long (или long long) в представлении String - PullRequest
0 голосов
/ 10 мая 2018

Я хотел бы преобразовать unsigned char testData[8] = {0xFF,0xF0,0x00,0xA0,0x00,0x00,0x00,0x99}; в строку (тип переменной 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());

Но это возвращает символы asci значений char,что имеет смысл.Но то, что я пытаюсь достичь, - это интерпретировать все биты (8x8) массива как long long (64-битное целое число) и преобразовать это числовое значение в его строковое представление.Я хочу добиться этого, чтобы я мог отправить его в JSON на мой сервер nodejs (который не поддерживает 64 бита, поэтому мне, вероятно, придется разделить его на два).

Так, например, если у меня есть: {0xFF,0xF0,0x00,0xA0,0x00,0x00,0x00,0x99} и его длинное длинное значение, например: 9894736399534, тогда я хотел бы получить «9894736399534» в моем объекте String.

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Как уже отмечали другие, все, что вам нужно сделать, это интерпретировать необработанные данные как длинный (без знака) длинный, а затем сохранить значение в строке, например:

#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;
0 голосов
/ 10 мая 2018

Я думаю, что с помощью bitset это может быть легко выполнено, и вот пример того же кода:

#include <iostream>
#include <sstream>
#include <cstdlib>
#include <bitset>
int main(void)
{
    unsigned char testData[8] = {0xFF,0xF0,0x00,0xA0,0x00,0x00,0x00,0x99};
    std::cout<<"size of array is "<<sizeof(testData)<<std::endl;
    std::stringstream strStream;
    for(unsigned int i=0;i<sizeof(testData);i++)
    {
      std::bitset<16> test(testData[i]);
      strStream<<test.to_ullong();

    }
    std::cout<<"Final string corresponding to this unsigned char array is "<<strStream.str()<<std::endl;

    return EXIT_SUCCESS;
}
0 голосов
/ 10 мая 2018

Сначала вам нужно переосмыслить память как 64-битный int указатель, затем создать строку из числа в этой области памяти.

Так что конвертируйте char* в unsigned long long*, затем разыменуйте его и создайте строку.

Этот код должен работать.

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