【问题标题】:embedding chars in int and vice versa在 int 中嵌入字符,反之亦然
【发布时间】:2013-10-12 15:05:34
【问题描述】:

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

在 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);

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

【问题讨论】:

  • dmcr_code - this link 不直接回答 this 问题,但我认为您应该很感兴趣因为它对字节序、位交换和字节顺序进行了广泛的讨论。
  • 我会看看,我还发现了一些其他有用的链接,我会看看。

标签: c


【解决方案1】:

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

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

如果 x 是无符号的。

【讨论】:

  • 这个 LSB 在小端和大端机器上都能正常工作吗?我对这些事情还没有那么有经验,这就是我问的原因
  • 宏操作的是值,而不是存储。值没有字节序。
  • 唯一需要担心字节序或位模式表示的情况是,如果您正在执行诸如将指针转换为值或从联合中读取(所有这些都有未定义的行为)之类的事情。通常的算术运算(包括像&amp; 这样的“按位”运算)仅根据值的含义定义,而不是它们在硬件中的表示。
  • 请记住,字节序是指字节在计算机内存中的排序方式,并且(如前所述)与变量中呈现的值无关。由于您的编译器,无论机器类型如何,变量都将始终以其值呈现自己。
  • 整数 1 在内存中的布局将是这样的:如果这是大端,则为 00 00 00 01,如果是小端,则为:01 00 00 00
【解决方案2】:

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

【讨论】:

  • 我在某个设备上写,我还不知道它是否支持这些功能,但感谢您的提示
  • 哪个编译器/C 库?
【解决方案3】:

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

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

顺便说一句,HERE 是一个相关的帖子。

【讨论】:

    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2012-11-11
    • 2012-03-06
    • 2023-03-27
    • 1970-01-01
    • 2019-12-27
    相关资源
    最近更新 更多