javaの場合と同様に、バイト配列がObjectiveCに渡されたときに32ビットの数値を取得する方法。
ByteBuffer bb = ByteBuffer.wrap(truncation);
return bb.getInt();
ここで、切り捨てはバイト配列です。32ビットの数値を返します。これはObjectiveCで可能ですか?
javaの場合と同様に、バイト配列がObjectiveCに渡されたときに32ビットの数値を取得する方法。
ByteBuffer bb = ByteBuffer.wrap(truncation);
return bb.getInt();
ここで、切り捨てはバイト配列です。32ビットの数値を返します。これはObjectiveCで可能ですか?
数値がバッファ内でリトルエンディアンでエンコードされている場合は、次を使用します。
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
エンディアンに応じて:
uint32_t n = b0 << 24 | b1 << 16 | b2 << 8 | b3;
また
uint32_t n = b3 << 24 | b2 << 16 | b1 << 8 | b0
4バイトを読み取り、その値を整数に割り当てたいかどうかはわかりません。この場合:
int32_t number;
memcpy(&number, truncation, sizeof(uint32_t));
エンディアンについて
あなたの質問から(私にとって)、バイトはすでに正しく順序付けられていることが明らかでした。ただし、これらのバイトを並べ替える必要がある場合は、次のntohl()
後に使用してmemcpy()
ください。
number=ntohl(number);