我一直想通过iOS应用程序通过TCP连接来尝试该项目Axon。在文档末尾,对协议的解释如下
有线协议很简单,并且非常类似于zeromq,其中是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的char或无符号char数组;
十进制常量:
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;
}
关于objective-c - 构造位掩码?按位分组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19586453/