0

私は、TCP 接続を介して接続する iOS アプリを使用して、このプロジェクトAxonを試してみたいと思っていました。ドキュメントの終わりに向かって、プロトコルは次のように説明されています

ワイヤ プロトコルは単純で、zeromq に非常によく似ています。データ バイトは現在、コーデックを格納するためにのみ使用されます。たとえば、「json」は単純に 1 です。クライアント エンドで受信した JSON メッセージは、この同じコーデックを選択することで自動的にデコードされます。

ダイアグラム付き

 octet:     0      1      2      3      <length>
         +------+------+------+------+------------------...
         | meta | <length>           | data ...
         +------+------+------+------+------------------...

次のようなパケットを作成するバイナリ プロトコルを使用した経験があります。

NSUInteger INT_32_LENGTH = sizeof(uint32_t);

uint32_t length = [data length]; // data is an NSData object

NSMutableData *packetData = [NSMutableData dataWithCapacity:length + (INT_32_LENGTH * 2)];
[packetData appendBytes:&requestType length:INT_32_LENGTH]; 
[packetData appendBytes:&length length:INT_32_LENGTH];                  
[packetData appendData:data];                                           

私の質問は、Axon リクエストのデータ パケットをどのように作成するかということです。

4

1 に答える 1

0

サイズ == packet_size の char または unsigned char の配列を 1 つ割り当てます。デカル定数:

const int metaFieldPos = 0;
const int sizeofMetaField = sizeof(char);
const int lengthPos = metaFieldPos + sizeofMetaField;
const int sizeofLengthField = sizeof(char) * 3;
const int dataPos = lengthPos + sizeofLengthField;

データを取得し、パケットの先頭を認識できる場合は、上記の定数を使用してポインターでナビゲートできます。

これらの関数が役立つかもしれません(Qtを使用していますが、使用するライブラリに簡単に変換できます)

quint32 Convert::uint32_to_uint24(const quint32 value){
    return value & (quint32)(0x00FFFFFFu);
}

qint32 Convert::int32_to_uint24(const qint32 value){
    return value & (qint32)(0x00FFFFFF);
}

quint32 Convert::bytes_to_uint24(const char* from){
    quint32 result = 0;
    quint8 shift = 0;
    for (int i = 0; i < bytesIn24Bits; i++) {
        result |= static_cast<quint32>(*reinterpret_cast<const quint8 *>(from + i)) << shift;
        shift+=bitsInByte;
    }
    return result;
}

void Convert::uint32_to_uint24Bytes(const quint32 value, char* from){
    quint8 shift = 0;
    for (int i = 0; i < bytesIn24Bits; i++) {
        const quint32 buf = (value >> shift) & 0xFFu;
        *(from + i) = *reinterpret_cast<const char *>(&buf);
        shift+=bitsInByte;
    }
}

QByteArray Convert::uint32_to_uint24QByteArray (const quint32 value){
    QByteArray bytes;
    bytes.resize(sizeof(value));
    *reinterpret_cast<quint32 *>(bytes.data()) = value;
    bytes.chop(1);
    return bytes;
}
于 2013-10-25T10:49:08.910 に答える