Еще один инвертированный массив символов в C - PullRequest
0 голосов
/ 12 декабря 2018

Этот код будет работать на платежном устройстве (POS).Для этой цели я должен использовать устаревший C (а не C # или C ++).

Я пытаюсь подготовить простые данные программного обеспечения для чтения / записи карт Mifare.Ниже приведен мой справочный документ, и я пытаюсь добиться того, что описано на стр. 9, пояснения к блокам значений 8.6.2.1.http://www.nxp.com/documents/data_sheet/MF1S50YYX_V1.pdf

Я просто очень хорошо знаю основы C. Все мои поиски в Интернете провалились.Согласно документу:

1 - существует целочисленная переменная со значением 1234567.

2 - существует char array[4], у которого должен быть гекс выше указанного значения, равное 0x0012D687

3 - Я должен инвертировать этот массив символов [4] и достичь значения 0xFFED2978

Мне нужно сделать некоторые другие вещи, но я застрял в номере 3 выше.Последнее, что я попробовал, это

int value = 1234567;
char valuebuffer[4];
char invertbuffer[4];

sprintf(valuebuffer, "%04x", value);  
for(i = 0;  i < sizeof(valuebuffer);  i++ )
{   
    invertbuffer[i] ^= valuebuffer[i];  
}

Когда я печатаю, я читаю другое значение в invertbuffer, а не 0xFFED2978

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Прежде всего, вы должны использовать типы из stdint.h, а не char, поскольку последний имеет подпись, определяемую реализацией, и, следовательно, в целом непригоден для хранения необработанных двоичных данных.

С этим отсортированным, вы можете использовать объединение для максимальной гибкости:

#include <stdint.h>
#include <stdio.h>

typedef union
{
  uint32_t u32;
  uint8_t  u8 [4];
} uint32_union_t;

int main (void)
{
  uint32_union_t x;
  x.u32 = 1234567;

  for(size_t i=0; i<4; i++)
  {
    printf("%X ", x.u8[i]);
  }
  printf("\n");

  x.u32 = ~x.u32;

  for(size_t i=0; i<4; i++)
  {
    printf("%X ", x.u8[i]);
  }
  printf("\n");
}

Примечательно, что порядок доступа u8 зависит от порядка байтов.Это может быть удобно при работе с чем-то вроде RFID, который не обязательно должен иметь такой же сетевой префикс, как ваш MCU.

0 голосов
/ 12 декабря 2018

Похоже, вы делаете это более сложным, чем нужно.Вы можете сделать двоичную инверсию для переменной int, а не возиться с отдельными байтами.

int value = 1234567;
int inverted= ~ value;

printf("%x\n",value);
printf("%x\n",inverted);

дает вывод

12d687

ffed2978

...