不得不說,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。
引以為戒啊!!!