使用方法

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. 使用 Microsoft Fakes 进行单元测试

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 在编写单元测试时,我们会遇到不同的外部依赖项,大体上可以分为两类: 依赖于接口或抽象类 依赖于具体类 ...

  2. C#笔试题(一)

    一.下面是一个由*号组成的4行倒三角形图案. 要求: 1.输入倒三角形的行数,行数的取值3-21之间,对于非法的行数,要求抛出提示"非法行数!": 2.在屏幕上打印这个指定了行数的 ...

  3. HTTP权威指南阅读笔记一:HTTP概述

    HTTP协议版本: 1.HTTP/0.9:HTTP的1991原型版本称为HTTP/0.9.这个协议有很多严重的缺陷,只应该用与与老客户端的交互.HTTP/0.9只支持GET方法,不支持多媒体内容的MI ...

  4. jQuery Mobile + HTML5

    最近项目需要,需要构建一个适合手持设备访问的站点,作者从网上查阅了一些资料,本文就是基于此而来. 首先下载jQuery Mobile http://jquerymobile.com/,选择稳定版即可. ...

  5. HTML5 canvas globalCompositeOperation绘图类型讲解

    我们总是将一个图形画在另一个之上,大多数情况下,这样是不够的.比如说,它这样受制于图形的绘制顺序.不过,我们可以利用 globalCompositeOperation 属性来改变这些做法.global ...

  6. SQL范式小结

    说明:大多数初学者对于关系数据库中的范式很是头疼,我本人也是,所以今天又看了视频,总结了一下内容,尽量语言通俗易懂,少用专业术语以及概念. 首先要理解几个键值. 超键:在关系模式中,能唯一标识元组的属 ...

  7. lucene join解决父子关系索引

    http://www.cnblogs.com/LBSer/p/4417074.html 1 背景 以商家(Poi)维度来展示各种服务(比如团购(deal).直连)正变得越来越流行(图1a), 比如目前 ...

  8. centos 防火墙设置

    1.安装iptables防火墙 怎么知道系统是否安装了iptables?执行iptables -V,如果显示如: iptables v1.3.5 说明已经安装了iptables. 如果没有安装ipta ...

  9. [转] java.lang.IllegalArgumentException: Document base D:\apache-tomcat-7.0.47\webapps\XXX错误

    启动服务器,报上述错误,是因为在服务器中(如tomcat)删除了某项目,单残留的配置文件没删除造成的.解决办法是到服务器中找到conf\Catalina\localhost下找到错误信息中对应的配置文 ...

  10. ffmpeg mp3 to m3u8

    ffmpeg -i Sunshine.mp3 -c:a libmp3lame -b:a 128k -map 0:0 -f segment -segment_time 10 -segment_list ...