记一次字符数据处理时遇见的问题:16进制0x00翻译字符为‘\0‘

记一次字符数据处理时遇见的问题:16进制0x00翻译字符为’\0’

前两天在将视频流以H264格式推送网络再从网络获取视频流时遇到一个比较容易犯错的问题:十六进制0x00翻译成字符串是’\0’,使用strlen()和strncpy()对字符串数据进行求长度和复制时,会出现获得的strlen长度和实际数据长度不符,复制的字符串出现阶段或者不能复制问题。对于我这职场小新人来说,当时遇到的时候是有点懵逼的,后来在网上查找资料才知道问题所在。

strlen()函数原型:

size_t strlen ( const char * str );

函数功能:获取str字符串长度

strncpy()函数原型:

extern char *strncpy(char *dest, char *src, int n); 

函数功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中
(其它注意事项:暂时略过)

需要注意的是两个函数都是在遇见’\0’时就立即结束返回,当时在检测出H264数据的sps和pps数据头后需要复制的数据大致为:

00  00  00  01  67  xx xx xx xx  00  00  00  01  68  xx xx xx   

其中 0X 00 00 00 01 是H264数据帧中的分隔符也就是每个NAL前面的起始码(有时会是0X00 00 01),
0X67对应序列参数集sps
0x68对应图像参数集pps

当时在使用strncpy()函数将检测出来的这段数据头拷贝到指定的字符串变量时,没有想到十六进制0x00翻译为字符是‘\0’,在拷贝第一个数据0x00时,函数就已经退出返回,后面的数据根本没有再进行拷贝。strlen()计算拷贝后的数据长度时也是如此。

后面改用memcpy()函数对数据进行拷贝,因为memcpy()较为强大的地方是不以’\0’作为拷贝结束标识而是以指定长度为准,并且可以拷贝任何数据类型的对象。(每一个字符串拷贝函数在使用时都应该注意的是作为存放拷贝字符的空间是否足够大来容许你进行数据拷贝)
而计算长度时,在前面一步的获取这段sps和pps数据时已经有计算得出,直接将所得的数据长度值赋给对应得变量即可


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部