将字符嵌入int中,反之亦然

我有智能卡,我可以存储字节(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函数应该返回最低有效字节而不管机器的endiannes,这样的LSB函数会是什么样子?

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

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

正如我所说的,我希望它能够工作,不管机器的读者是什么,并且写它。 这会有用吗?

‘LSB’function可以通过宏实现如下: –

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

如果x是未签名的。

如果您的C库符合posix标准,那么您可以使用标准函数来完成您要编写的代码。 ntohlntohshtonlhtons (网络主机长,网络主机短,…)。 这样,如果要为big-endian或little-endian架构编译代码,则无需更改代码。 这些函数在arpa/inet.h中定义(参见http://linux.die.net/man/3/ntohl )。

我认为您的问题的答案是肯定的,您可以在智能卡上写入数据,以便大端和小端方向的读者普遍(并且正确地)阅读。 有一个重要的警告: 读者有责任进行解释,而不是你的智能卡解释读者,不是吗? 也就是说,正如您所知,有许多例程可以确定结束( 1,2,3 )。 但是读者必须包含测试endianess的代码,而不是你的卡片。

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

顺便说一下, HERE是一个相关的post。