Добавить значение в последнем индексе массива char, используя C ++ - PullRequest
0 голосов
/ 09 ноября 2018

Я хочу отправить массив через socket. Длина массива равна 16, где последние четыре байта являются значениями. Чтобы сделать это динамическим, я пытаюсь добавить значение в конец массива.

У меня есть unsigned char массив

Например:

unsigned char command[] = { 0x40, 0x01, 0x00, 0x02, 0x00, 0x08, 0x11, 0x4c, 0x00, 0x00, 0xa1, 0x24 };

Я хочу добавить значение в конце этого массива.

int value = 380;

Итак, шестнадцатеричное представление 380 равно 17c

Теперь массив становится

0x40, 0x01, 0x00, 0x02, 0x00, 0x08, 0x11, 0x4c, 0x00, 0x00, 0xa1, 0x24, 0x00, 0x00, 0x01, 0x7c

где последние четыре байта являются значениями.

Я попытался добавить последние четыре байта, сначала создав массив, который имеет значения

char* temp = "00000380"

и затем с помощью for loop добавить это в новый массив

Код

int m_imageX = 380;

char m_buf[3] = { '\0' };
int count = 0;
int value = 0;
int m_index;

unsigned char command[16];
unsigned char commandss[] = { 0x40, 0x01, 0x00, 0x02, 0x00, 0x08, 0x11, 0x4c, 0x00, 0x00, 0xa1, 0x24 };
for (m_index = 0; m_index < 12; m_index++)
{
    command[m_index] = commandss[m_index];
}

std::string m_tmp = std::to_string(m_imageX);
char const *tmp = m_tmp.c_str();
char comm[8];
int size = strlen(tmp);
for (int i = 0; i < 8 - size; i++)
{
    comm[i] = '0';
}
for (int i = 8 - size; i < 8; i++)
{
    comm[i] = tmp[count++];
}

count = 0;
for (int j = 0; j < 8; j++)
{

    if (j > 0  && j % 2 == 0)
    {
        command[m_index++] = atoi(m_buf);
        count = 0;
        memset(m_buf, NULL, sizeof(m_buf));
        m_buf[count++] = comm[j];
    }
    else
    {
        m_buf[count++] = comm[j];
    }
}

command[m_index] = atoi(m_buf);

Но когда я отправлял это, я обнаружил на wireshark, что передаваемый массив имеет значение, подобное

    0x40, 0x01, 0x00, 0x02, 0x00, 0x08, 0x11, 0x4c, 0x00, 0x00, 0xa1, 0x24, 0x00, 0x00, 0x03, 0x50

Так может кто-нибудь сказать мне, как это сделать

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Используйте сдвиговые и побитовые операторы, чтобы разбить целое число на байты, и сохранить в std::vector

0x17c & 0xFF результаты 0x7c. Сдвиньте вправо на 8 бит и повторите, чтобы получить следующий байт. В приведенном ниже примере будут добавлены байты в формате с прямым порядком байтов 00 00 01 7C:

#include <iostream>
#include <string>
#include <vector>

int main()
{
    std::vector<unsigned char> vec =
    { 0x40, 0x01, 0x00, 0x02, 0x00, 0x08, 0x11, 0x4c, 0x00, 0x00, 0xa1, 0x24 };

    int num = 380;
    std::vector<unsigned char> bytes;
    for(int i = 0; i < 4; i++)
    {
        bytes.insert(bytes.begin(), num & 0xFF);
        num = num >> 8;
    }

    for(auto e : bytes)
        vec.push_back(e);

    for(auto e : vec)
        std::cout << std::hex << (unsigned int)e << " ";
    std::cout << "\n";

    return 0;
}

выход: * +1010 *

40 1 0 2 0 8 11 4c 0 0 a1 24 0 0 1 7c
0 голосов
/ 09 ноября 2018

Вы считаете, что символы, представляющие ваши строки, имеют то же двоичное представление, что и ваше исходное число. Это не тот случай.

Вы можете использовать reinterpret_cast, чтобы иметь возможность передавать двоичное представление вашего размера в массиве char:

int64_t m_imageX = 380;
const char* tmp = reinterpret_cast<const char*>(&m_imageX);

for (int i = 8 - size; i < 8; i++)
{
    comm[i] = tmp[count++];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...