0

私はこのコードを使用しています:

int number; //=smth
unsigned char sendBuffer[255];
sendBuffer[0] = number & 0xFF;
sendBuffer[1] = (number  >> 8) & 0xFF;
sendBuffer[2] = (number  >> 16) & 0xFF;
sendBuffer[3] = (number  >> 24) & 0xFF;

numberバイト配列に入れますsendBuffer

私の質問は:

  1. バイト配列に 2 つの数値を埋め込みたいとします。このように進めますか?

    sendBuffer[0] = number & 0xFF;
    sendBuffer[1] = (number  >> 8) & 0xFF;
    sendBuffer[2] = (number  >> 16) & 0xFF;
    sendBuffer[3] = (number  >> 24) & 0xFF;
    sendBuffer[4] = number2 & 0xFF;
    sendBuffer[5] = (number2  >> 8) & 0xFF;
    sendBuffer[6] = (number2  >> 16) & 0xFF;
    sendBuffer[7] = (number2  >> 24) & 0xFF;
    

    number サイズが8または6バイトであっても、これは機能しますか? (これを言っているのは、一部のプラットフォームでは int が 4 バイトまたは 6 である可能性があるためです。したがって、number が 6 バイトの場合でも上記のコードが機能するかどうかを考えていました。さらに注意すべきことは、6 バイトであっても、その中に4バイトの整数を格納すると、上記のコードは機能しますか?)。

    通常、このバッファはカードの一部のメモリに保存され、読み取りに問題はありません(たとえば、エンディアンなどの問題、読み取り時のバイト配列は保存した順序で来るようです)。

  2. 最後に、バイト配列から整数を再構築する方法はsendBuffer?

4

3 に答える 3

0
  1. これは、32 ビット (4 バイト) の整数に対してのみ機能します。ラージ int をサポートする場合は、64 ビット (8 バイト) バージョンを作成する必要があります。

  2. ビットごとの OR を使用してプロセスを逆にすることができます。

    #define BigEndianGetUInt32(ptr)  ( ((uint32)((uint8*)(ptr))[0]) << 24 | \  
                                       ((uint32)((uint8*)(ptr))[1]) << 16 | \  
                                       ((uint32)((uint8*)(ptr))[2]) <<  8 | \  
                                        (uint32)((uint8*)(ptr))[3]) )
    number  = BigEndianGetUInt32(sendBuffer);
    number1 = BigEndianGetUInt32(sendBuffer+4);
    

補足として、同じデバイス用にデータをシリアル化する場合は、memcpynumbersendBuffer.

memcpy(sendBuffer, &number, sizeof(number));
memcpy(sendBuffer+sizeof(number), &number1, sizeof(number1));
于 2013-09-24T09:20:08.507 に答える
0

number のサイズが 8 または 6 バイトの場合でも、これは機能しますか?

それは機能しますが、値のすべてのバイトを保存するには、明らかに行を追加する必要があります。これは多くの手作業であり、あまり拡張できません。代わりにプログラムによるアプローチを使用する

auto num = number;
for (size_t i = 0; i < sizeof(number); i++, num >>= CHAR_BIT)
    sendBuffer[i] = number & 0xFF;

しかし、すでに持っているのになぜそうするのmemcpy()ですか?このようにして、必要なのは1 行だけであり、さらに良いことに、複数の値に簡単に拡張できます

memcpy(&sendBuffer[0],               number1, sizeof number1);
memcpy(&sendBuffer[sizeof(number1)], number2, sizeof number2);

最後に、バイト配列 sendBuffer から整数を再構築する方法は?

簡単。バイトを後ろにシフトするだけです

number  = (sendBuffer[3] << 24) | (sendBuffer[2] << 16) | (sendBuffer[1] << 8) | sendBuffer[0];
number2 = (sendBuffer[7] << 24) | (sendBuffer[6] << 16) | (sendBuffer[5] << 8) | sendBuffer[4];

繰り返しますが、そのような面倒な作業は避けて、forループを使用してください

number = 0;
for (size_t i = 0; i < sizeof(number); i++)
    number = (number << 8) | sendBuffer[i];

しかしmemcpy、機能し、強くお勧めします

memcpy(&number, &sendBuffer[numberIndex], sizeof number);
于 2013-09-24T09:19:08.203 に答える