Копирование массива int без знака в C - PullRequest
0 голосов
/ 24 февраля 2012

Мне нужно создать массив без знака для удаленного сообщения IR.Для этого мне нужно соединить заголовок с битами данных, в зависимости от того, какой ключ я хочу имитировать.Вот что у меня есть, и проблема:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const unsigned HEADER[34] = {4608, 4398, 655, 1588, 655, 1588, 655, 1588, 655, 472, 655, 472, 655, 472, 655, 472, 655, 472, 655, 1588, 655, 1588, 655, 1588, 655, 472, 655, 472, 655, 472, 655, 472, 655, 472};

unsigned short BTN_VOL_UP = 0xE01F;

void intToBin(unsigned short a, char* buffer) {
    buffer += 15;
    int i = 15;
    for (i; i >= 0; i--) {
        *buffer-- = (a & 1) + '0';
        a >>= 1;
    }
}

void hexToData(unsigned** data, int code) {
  char* strHex = (char*) malloc(16 * sizeof(char));
  intToBin(code, strHex);
  int i = 0;
  for(i; i < 16; i++) {
    char c = strHex[i];
    *(*data)++ = 655;
    if (c == '1') {
      *(*data)++ = 1588;
    } else {
      *(*data)++ = 472;
    }
  }
  (*data) -= 32;
}

void getCode(unsigned** data, short code) {
  int i = 0;
  for (i; i < 34; i++) {
    *(*data)++ = HEADER[i];
  }
  unsigned* bits = (unsigned*) malloc(32 * sizeof(unsigned));
  hexToData(&bits, code);
  i = 0;
  for (i; i < 32; i++) {
    *(*data)++ = bits[i];
  }
  *(*data)++ = 647;
  *(*data)++ = 0;
  (*data) -= 68;
}

И вот код, вызывающий все это:

unsigned* data = (unsigned*) calloc(68, sizeof(unsigned));
getCode(&data, BTN_VOL_UP);

После этого я печатаю ЗАГОЛОВОК (используя для для печати каждого значения)и переменная данных, но это то, что я получаю:

4608 4398 655 1588 655 1588 655 1588 655 472 655 472 655 472 655 472 655 472 655 1588 655 1588 655 1588 655 472 655 472 655 472 655 472 655 472

0 136 1588 655 1588 655 1588 655 472 655 472 655 472 655 472 655 55298 36609 55298 36609 55298 36609 55298 36609 55298 36609 55298 36609 55298 36609 55298 36609 655 655 1588 655 1588 655 1588 655 472 655 472 655 472 655 472 655 472 655 472 655 472 655 472 655 1588 655 1588 655 1588 655 1588 655 1588 647 0 16

Заголовок правильный, но все данные перепутаны: заголовокв данных совершенно неверно, фактически часть данных (код VOL_UP) верна, но в конце есть дополнительное значение, которого не должно быть: 16. массив должен заканчиваться на ... 647, 0}.

Есть идеи, что не так с кодом?

РЕДАКТИРОВАТЬ: Я нашел проблему, отредактировал код, чтобы включить исправления.Оказывается, у меня были проблемы с поиском точного местоположения для копирования значений, поэтому я решил вручную скопировать int с помощью int и вычесть указатель в конце.Ужасно, но это работает.

1 Ответ

2 голосов
/ 24 февраля 2012

Ваш код выдает следующее ...

4608 4398 655 1588 655 1588 655 1588 655 472 655 472 655 472 655 472 655 472 655 1588 655 1588 655 1588 655 472 655 472 655 472 655 472 655 472 1588 1588 1588 655 655 655 655 655 655 655 655 1588 1588 1588 1588 1588 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 647 0

Кажется, заголовок в порядке. Я не знаю алгоритм генерации ключей, поэтому я не могу сказать вам, подходят ли значения 34-49, но у вас определенно есть проблема в диапазоне 50-65. Ваш код никогда не устанавливает их в любое значение. Обычно malloc не инициализирует память (это зависит от реализации стандартной библиотеки), поэтому вы получите мусор через 50-65.

...