sequence - 在大端架构中提取 RTP 序列
问题描述
为了在 little endian 架构中提取 RTP 标头的序列号,使用以下类型 unsigned short seq = (packet[2] << 8) | 数据包[3];在大端序中,以下是正确的 unsigned short seq = (packet[3] << 8) | 数据包[2]?
解决方案
不,您在两种架构上使用相同的代码。重要的是数据的字节序格式,而不是 CPU 的字节序。
根据协议规范,RTP 序列号以最高有效字节在前和最低有效字节在后的方式存储。因此,如果序列号是 0x1234(或十进制 4660),它将存储在您的 2 个字节中packet[2]
,并packet[3]
作为
packet byte 0 1 2 3
+---+---+---+---+
|...|...|12 |34 |
+---+---+---+---+
现在您要提取字节 2 并将其作为整数中的最高有效字节,并将字节 3 置于最低有效字节,这就是代码:
uint16_t seq = (packet[2] << 8) | packet[3];
这使得seq
值 0x1234(或十进制 4660)与 CPU 的字节序无关。
推荐阅读
- java - Mongo Flux/Mono 获取对象/s
- javascript - 如何使用批处理文件自动化 reactjs 构建过程?
- typescript - 带有 Vue js 的打字稿
- c++ - 异常没有被销毁
- sql - 根据年份而不是最小值或最大值重置序列
- ios - 在laravel中字符0周围的Alamofire无效值
- javascript - PaperJS 变量,我如何将这些存储在 MongoDB 中?
- php - 在标题 Drupal 8 中移动视图暴露过滤器
- sql - 在 HIve 中使用带有 if 条件的 select 语句来填充另一列
- symfony - 如何覆盖奏鸣曲管理控制器以提供另一个对象的字段