构建位掩码?按位数据包



我一直想用一个通过TCP连接连接的iOS应用程序来试验这个项目Axon。在文档的最后,协议是这样解释的

有线协议很简单,非常像零mq,其中是一个BE 24位无符号整数,表示最大长度约为~16mb。数据字节目前仅用于存储编解码器,例如"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 请求创建数据包,我会假设一些位移位,我不太了解。

分配 1 个大小为 == packet_size 的字符或无符号字符数组;贴花常数:

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;
}

最新更新