3

我有可以存储字节(16 的倍数)的智能卡。如果我这样做:Save(byteArray, length)那么我可以这样做Receive(byteArray,length) ,我想我会按照我存储的顺序获得字节数组。现在,我有这样的问题。我意识到如果我在这张卡上存储整数,而其他机器(具有不同的字节序)读取它,它可能会得到错误的数据。所以,我想也许解决方案是我总是以小端方式将数据存储在这张卡上,并且总是以小端方式检索数据(我会编写应用程序来读写,所以我可以自由地解释数字,因为我喜欢。)。这可能吗?这是我想出的东西:

在 char 数组中嵌入整数:

int x;
unsigned char buffer[250];

buffer[0] = LSB(x);
buffer[1] = LSB(x>>8);
buffer[2] = LSB(x>>16);
buffer[3] = LSB(x>>24);

重要的是我认为LSB函数应该返回最低有效字节,而不管机器的字节序如何,这样的 LSB 函数会是什么样子?

现在,重建整数(类似这样):

int x = buffer[0] | (buffer[1]<<8) | (buffer[2]<<16) | (buffer[3]<<24);

正如我所说,我希望它能够工作,无论读取和写入它的机器的字节序如何。这行得通吗?

4

3 回答 3

1

“LSB”功能可以通过如下宏实现:-

#define LSB(x) ((x) & 0xFF)

前提是 x 是无符号的。

于 2013-10-12T15:20:22.213 回答
1

如果您的 C 库与 posix 兼容,那么您可以使用标准函数来执行您正在尝试编写的代码。ntohl, ntohs, htonl, htons(网络到主机长,网络到主机短,...)。这样,如果您想为大端或小端架构编译它,您就不必更改代码。这些函数在arpa/inet.h(参见http://linux.die.net/man/3/ntohl)中定义。

于 2013-10-12T15:26:27.213 回答
0

我认为您的问题的答案是肯定的,您可以在智能卡上写入数据,以便大端和小端方向的读者普遍(并且正确)读取它。 有一个很大的警告:阅读器有责任进行解释,而不是你的智能卡解释阅读器,不是吗?也就是说,如您所知,有许多例程可以确定字节顺序(123)。但是阅读器必须包含代码来测试字节顺序,而不是你的卡。

您的代码示例有效,但考虑到问题的性质,我不确定是否有必要。

顺便说一下,这里是一个相关的帖子。

于 2013-10-12T16:33:42.910 回答