使用C ++在char数组的最后一个索引中添加值

时间:2018-11-09 09:22:07

标签: c++ arrays sockets hex

我想通过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 :(得分:2)

您正在考虑表示字符串的字符与原始数字具有相同的二进制表示形式。并非如此。

您可能希望使用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++];
}

答案 1 :(得分:1)

使用shift和按位运算符将整数分成字节,然后存储在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;
}

输出:

40 1 0 2 0 8 11 4c 0 0 a1 24 0 0 1 7c