'\0'的悲剧

不得不说,C语言没有学好真的是一个悲剧 = =。

今天在做视频采集编码的时候就被这个'\0'给虐了,在这里感谢百度,让我找到了答案。

事情是这样的:我在linux下用摄像头采集到了yuv数据,然后要将其用x264编码成h264格式的视频。我将编码好得视频帧保存在unsigned char *buf 中,然后将这个buf写到 zgy.h264 文件中;与此同时,我还将yuv数据也写到了 zgy.yuv 文件中。尼玛世界上诡异的事情多了去了,我用同样操作,同样方法,同样的心情对待同样事情,结果同样得操作得到了不一样的结果,生活就像这样苦B,看似平静湖水,谁知道底下是不是在翻江倒海。。。zgy.yuv文件很饱满,可是zgy.h264却空空如也!!!

你说我一个文艺小青年,遇到这样不可理喻事情不找出原因怎么对得起我那强烈地求知欲望啊?

于是我进入调试模式,在各个地方用 printf 打印日志,看看问题处在哪里,当我输出 strlen(buf) 的时候,NND亮瞎了我的眼,尼玛亮瞎了我的眼睛啊。。。

在用 for( index = 0; index < length; ++index) printf("%d ", buf[index]);的时候它乖乖地打印出所有数据,可是当我 printf("%d", strlen(buf));的时候它又红果果地显示出大大的 0, 坑爹啊,还好我的心里承受能力强大,不让我会被整死的,明明显示出来所有数据,可是strlen得结果却是 0, 是0啊,0啊0,是0啊0啊亲!!!

我很不爽,于是百度了一下,终于明白了。原来strlen()函数的原理是计算遇到的第一个 '\0'与 index=0之间的距离差。

比如 一个数组 char p[5];  若p[0] = '0', p[1] = '1', p[2] = '2', p[3] = '\0', 那么strlen(p)的结果就是3,即有效数为 p[0/1/2],遇到p[3]就结束strlen函数了。

而用x264编出每一帧码流的起始位都是 0x00 00 00 01,也就是说我用 unsigned char *buf的话, buf[0] = '\0', buf[1] = '\0', buf[2] = '\0', buf[3] = 1,  所以strlen遇到buf[0]就停止了。

注意这里要区分 '0' 与 '\0', 0x00 00 00 01 这里的00 对应得ASCII码为0, 而'0'输出得数值对应得ASCII码为48。

引以为戒啊!!!

你可能感兴趣的:(c,linux,生活,百度,语言)