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 相同的网络字节顺序。
该代码将 运行 用于支付设备 (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 相同的网络字节顺序。