簡體   English   中英

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

[英]embedding chars in int and vice versa

我有智能卡,我可以存儲字節(16的倍數)。 如果我這樣做: Save(byteArray, length)然后我可以做Receive(byteArray,length) ,我想我將按照我存儲的相同順序獲取字節數組。 現在,我有這樣的問題。 我意識到如果我在這張卡上存儲整數,並且其他一些機器(具有不同的字節序)讀取它,它可能會得到錯誤的數據。 因此,我認為可能解決方案是我總是以一種小端方式將數據存儲在此卡上,並始終以一種小端方式檢索數據(我將編寫應用程序進行讀寫,因此我可以自由地將數字解釋為I喜歡。)。 這可能嗎? 以下是我提出的問題:

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

重要的是我認為無論機器的endiannes如何, LSB函數都應該返回最低有效字節,這樣的LSB函數會是什么樣子?

現在,重建整數(類似這樣):

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

正如我所說,我希望這個工作,不管機器的讀者是什么,並且寫它。 這會有用嗎?

“LSB”功能可以通過宏實現如下: -

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

如果x是未簽名的。

如果您的C庫符合posix標准,那么您可以使用標准函數來完成您嘗試編寫的代碼。 ntohlntohshtonlhtons (網絡主機長,網絡主機短,...)。 這樣,如果要為big-endian或little-endian架構編譯代碼,則無需更改代碼。 這些函數在arpa/inet.h中定義(參見http://linux.die.net/man/3/ntohl )。

我認為您的問題的答案是肯定的,您可以在智能卡上寫入數據,以便大端和小端方向的讀者普遍(並且正確地)閱讀。 有一個重要的警告: 讀者有責任進行解釋,而不是你的智能卡解釋讀者,不是嗎? 也就是說,當你知道有很多程序,以確定字節序( 123 )。 但是讀者必須包含測試endianess的代碼,而不是你的卡片。

您的代碼示例有效,但鑒於問題的性質,我不確定是否有必要。

順便說一下, HERE是一個相關的帖子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM