0

javaの場合と同様に、バイト配列がObjectiveCに渡されたときに32ビットの数値を取得する方法。

ByteBuffer bb = ByteBuffer.wrap(truncation);   
return bb.getInt();

ここで、切り捨てはバイト配列です。32ビットの数値を返します。これはObjectiveCで可能ですか?

4

3 に答える 3

0

数値がバッファ内でリトルエンディアンでエンコードされている場合は、次を使用します。

int32_t getInt32LE(const uint8_t *buffer)
{
    int32_t value = 0;
    unsigned length = 4;
    while (length > 0)
    {
        value <<= 8;
        value |= buffer[--length];
    }
    return value;
}

数値がバッファ内でビッグエンディアンでエンコードされている場合は、次を使用します。

int32_t getInt32BE(const uint8_t *buffer)
{
    int32_t value = 0;
    for (unsigned i = 0; i < 4; i++)
    {
        value <<= 8;
        value |= *buffer++;
    }
    return value;
}

更新同じホストで作成されたデータを使用している場合、エンディアンは問題ではありません。その場合、バッファーと整数の間のブリッジunionとしてを使用できます。これにより、不快なキャストを回避できます。

union
{
    uint8_t b[sizeof(int32_t)];
    int32_t i;
} u;

memcpy(u.b, buffer, sizeof(u.b));
// value is u.i
于 2013-01-15T11:49:59.157 に答える
0

エンディアンに応じて:

uint32_t n = b0 << 24 | b1 << 16 | b2 << 8 | b3;

また

uint32_t n = b3 << 24 | b2 << 16 | b1 << 8 | b0
于 2013-01-15T11:51:45.590 に答える
0

4バイトを読み取り、その値を整数に割り当てたいかどうかはわかりません。この場合:

int32_t number;
memcpy(&number, truncation, sizeof(uint32_t));

エンディアンについて

あなたの質問から(私にとって)、バイトはすでに正しく順序付けられていることが明らかでした。ただし、これらのバイトを並べ替える必要がある場合は、次のntohl()後に使用してmemcpy()ください。

number=ntohl(number);
于 2013-01-15T11:56:48.967 に答える