C中的另一个反转字符数组

Another invert char array in C

该代码将 运行 用于支付设备 (POS)。为此,我必须使用遗留 C(不是 C# 或 C++)。

我正在尝试编写一个简单的Mifare卡read/write软件数据。下面的文档是我的参考,我正在尝试实现第 9 页上的内容,8.6.2.1 值块解释。 http://www.nxp.com/documents/data_sheet/MF1S50YYX_V1.pdf

我只知道 C 的基础知识。我在 Internet 上的所有搜索都失败了。根据文件:

1- 存在值为1234567.

的整型变量

2- 有 char array[4] 应该有上述值的十六进制,即 0x0012D687

3- 我应该反转那个 char 数组 [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

中读取了一些其他值

你好像把它弄得比需要的更复杂了。您可以对 int 变量进行二进制反转,而不是弄乱单个字节。

int value = 1234567;
int inverted= ~ value;

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

为您提供

的输出

12d687

ffed2978

首先,您必须使用来自 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 相同的网络字节顺序。