使用方法

OscMessage mesg;
mesg.setAddress("m");
mesg.addIntArg();
mesg.addIntArg();
mesg.addIntArg(); g_oscSend.sendMessage(mesg);

先做记录,再做程序

整个消息是放在一个数组中

前8个字符做头   为#bundle\0

下面8个字节记录时间  这里都是1, 内存中为 0 0 0 0 0 0 0 1

再下面4个字节 整数  ,这里的数字大小指的是,osc地址的地址距离数据末尾的字节数 ,(也就是接收到数据包的长度减去这个值,就是osc消息的Adrrs的位置)

再下面就是地址字符串   大小根据字符串大小 ,然后4个字节对齐,不足补到4的倍数

再下面是所有参数的类型   第一个是 逗号,不知为何这样,  下面才是类型, 这里如果数量不是4的倍数也要补

接下来是每个参数的内存

类型

enum TypeTagValues {
TRUE_TYPE_TAG = 'T',
FALSE_TYPE_TAG = 'F',
NIL_TYPE_TAG = 'N',
INFINITUM_TYPE_TAG = 'I',
INT32_TYPE_TAG = 'i',
FLOAT_TYPE_TAG = 'f',
CHAR_TYPE_TAG = 'c',
RGBA_COLOR_TYPE_TAG = 'r',
MIDI_MESSAGE_TYPE_TAG = 'm',
INT64_TYPE_TAG = 'h',
TIME_TAG_TYPE_TAG = 't',
DOUBLE_TYPE_TAG = 'd',
STRING_TYPE_TAG = 's',
SYMBOL_TYPE_TAG = 'S',
BLOB_TYPE_TAG = 'b',
ARRAY_BEGIN_TYPE_TAG = '[',
ARRAY_END_TYPE_TAG = ']'
};

其中  bool  没有内存,只有一个tag

int32   4个字节

float  4个字节

char   4个字节

int64  8 个字节

double  8个字节

timetag   8个字节

string     补到4的倍数

2018-4-28

找到了一个代码实现


enum class ArgType : char { INTEGER_32 = 'i', FLOAT = 'f', DOUBLE = 'd', STRING = 's', BLOB = 'b', MIDI = 'm', TIME_TAG = 't', INTEGER_64 = 'h', BOOL_T = 'T', BOOL_F = 'F', CHAR = 'c', NULL_T = 'N', IMPULSE = 'I', NONE = NULL_T };
void Bundle::setTimetag( uint64_t ntp_time )
{
uint64_t a = htonll( ntp_time );
ByteArray<> b;
memcpy( b.data(), reinterpret_cast<uint8_t*>( &a ), );
mDataBuffer->insert( mDataBuffer->begin() + , b.begin(), b.end() );
} void Bundle::initializeBuffer()
{
static const std::string id = "#bundle";
mDataBuffer.reset( new std::vector<uint8_t>( ) );
std::copy( id.begin(), id.end(), mDataBuffer->begin() + );
(*mDataBuffer)[] = ;
}

    size_t addressLen = mAddress.size() + getTrailingZeros( mAddress.size() );

    auto typesSize = mDataViews.size() + ;
std::vector<char> typesArray( typesSize + getTrailingZeros( typesSize ) , ); typesArray[] = ',';
int i = ;
for( auto & dataView : mDataViews )
typesArray[i++] = Argument::translateArgTypeToCharType( dataView.getType() ); if( ! mCache )
mCache = ByteBufferRef( new ByteBuffer() ); size_t typesArrayLen = typesArray.size();
ByteArray<> sizeArray;
int32_t messageSize = addressLen + typesArrayLen + mDataBuffer.size();
auto endianSize = htonl( messageSize );
memcpy( sizeArray.data(), reinterpret_cast<uint8_t*>( &endianSize ), ); mCache->resize( + messageSize ); std::copy( sizeArray.begin(), sizeArray.end(), mCache->begin() );
std::copy( mAddress.begin(), mAddress.end(), mCache->begin() + );
std::copy( typesArray.begin(), typesArray.end(), mCache->begin() + + addressLen );
std::copy( mDataBuffer.begin(), mDataBuffer.end(), mCache->begin() + + addressLen + typesArrayLen ); auto dataPtr = mCache->data() + + addressLen + typesArrayLen;
for( auto & dataView : mDataViews ) {
if( dataView.needsEndianSwapForTransmit() )
dataView.swapEndianForTransmit( dataPtr );
}
static uint8_t getTrailingZeros( size_t bufferSize ) { return  - ( bufferSize %  ); }

和我之前的解释一样,现在这个可以照着自己解析了

UDP网络通信OSC 协议的更多相关文章

  1. UNIX网络编程——分析一帧基于UDP的TFTP协议帧

    下图是UDP的段格式: 相比TCP段格式,UDP要简单得多,也没啥好说的,需要注意的是UDP数据长度指payload加上首部的长度. 下面分析一帧基于UDP的TFTP协议帧: 以太网首部 0000: ...

  2. Java第三阶段学习(八:网络通信协议、UDP与TCP协议)

    一.网络通信协议 1.概念: 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传 ...

  3. 分析一帧基于UDP的TFTP协议帧

    下图是UDP的段格式: 相比TCP段格式,UDP要简单得多,也没啥好说的,需要注意的是UDP数据长度指payload加上首部的长度. 下面分析一帧基于UDP的TFTP协议帧: 以太网首部 0000: ...

  4. 基于FPGA的光口通信开发案例|基于Kintex-7 FPGA SFP+光口的10G UDP网络通信开发案例

    前言 自著名华人物理学家高锟先生提出"光传输理论",实用化的光纤传输产品始于1976年,经历了PDH→SDH→DWDM→ASON→MSTP的发展历程.本世纪初期,ASON/OADM ...

  5. 【RL-TCPnet网络教程】第16章 UDP用户数据报协议基础知识

    第16章      UDP用户数据报协议基础知识 本章节为大家讲解UDP(User Datagram Protocol,用户数据报协议),需要大家对UDP有个基础的认识,方便后面章节UDP实战操作. ...

  6. Python基础教程之udp和tcp协议介绍

    Python基础教程之udp和tcp协议介绍 UDP介绍 UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议.UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但 ...

  7. 基于UDP高性能传输协议UDT doc翻译(一)

    原文转自:http://hi.baidu.com/doodlezone/item/74a203155efe26dbbf9042dd                  UDT文档阅读理解 一.  概述 ...

  8. 涨知识-VI 基于TCP/UDP的应用层协议

    基于TCP/UDP的应用层协议: 基于TCP: Telnet(Teletype over the Network, 网络电传),通过一个终端(terminal)登陆到网络 FTP(File Trans ...

  9. Raknet是一个基于UDP网络传输协议的C++网络库(还有一些其它库,比如nanomsg,fastsocket等等)

    Raknet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务.通常情况下用于游戏,但也可以用于其它项目. Raknet有以下好处: 高性能 在同一台计算机 ...

随机推荐

  1. 初识ASP.NET 5中的Sake与KoreBuild

    从github上签出基于ASP.NET 5的MVC 6的源代码进行编译,发现有2个编译命令: build.cmd是针对Windows的编译命令,build.sh是针对Mac/Linux的编译命令,这本 ...

  2. Chrome RenderText分析(2)

      接Chrome RenderText分析(1) 继续分析以下步骤   一.TextRun结构 struct TextRun { TextRun(); ~TextRun(); ui::Range r ...

  3. 基于Criminisi算法的栅格影像数据敏感地物隐藏

    栅格影像数据敏感地物伪装是指通过计算机智能识别与计算,将影像数据中的敏感地物进行识别与提取,将敏感地物智能替换成公共地物,如草地.森林.湖泊.公园等.但目前该技术并不成熟,同时栅格影像数据敏感地物伪装 ...

  4. JSON相关(一):JSON.parse()和JSON.stringify()

    parse用于从一个字符串中解析出json对象,如 var str = '{"name":"huangxiaojian","age":&qu ...

  5. C#与数据库访问技术总结(十四)之DataAdapter对象

    DataAdapter对象 DataAdapter对象主要用来承接Connection和DataSet对象. DataSet对象只关心访问操作数据,而不关心自身包含的数据信息来自哪个Connectio ...

  6. MVC 添加 httpHandlers 支持 .aspx 页面访问

    <?xml version="1.0"?> <!-- For more information on how to configure your ASP.NET ...

  7. com.android.org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate: current time:

    http://www.cnblogs.com/mayongsheng/p/4387109.html https://github.com/awslabs/aws-sdk-android-samples ...

  8. PowerShell remoting中的second-hop问题

    一直以来都对powershell remote有点一知半解, 今天通过这个问题的解决, 理解加深了好多.   下文写的挺清楚的, 保留在这里. Using CredSSP for second-hop ...

  9. HTML5手机APP开发入(5)

    HTML5手机APP开发入(5) 回顾一下 HTML5手机APP开发入(4) 如何自定义Component,directive HTML5手机APP开发入(3) 如何实现MVC的代码重构,自定义一个P ...

  10. WindowsPhone-GameBoy模拟器开发四--Gameboy显示系统分析

    这次说一下GB的显示系统,先从一幅Gb的内存分布图说起,请看图: 图中红色框框起来的部分就是这篇文章关注的部分,这一部分的内存地址从8000-9Fff,共8KB,这一部分是从来存储背景和游戏“精灵”的 ...