關於memcpy拷貝後導致亂碼的問題!!!

今天碰到了一個很牛逼的錯誤呀,很簡單,就是memcpy的問題.

首先看代碼:


	uint8_t *extra_data = enc_ctx->extradata;
	int extra_data_size = enc_ctx->extradata_size;

	printf("extra_data_size:%d \n" , extra_data_size);

	uint8_t *__sps = extra_data + offset;

	//尋找下一個pps即可
	int inteval = offset;
	bool find = false;
	while( inteval < (extra_data_size - offset) )
	{
		if( extra_data[inteval] == 0x00 && extra_data[inteval+1] == 0x00 )
		{	
			if(extra_data[inteval+2] == 0x01) 
			{
				printf("find it 0x000001\n");
				find = true;
				break;
			}
			if(extra_data[inteval+2] == 0x00 && extra_data[inteval+3] == 0x01 ) 
			{
				printf("find it 0x00000001\n");
				find = true;
				break;
			}
		}
		inteval++;
	}

	if(!find) return -1;


	
	//copy sps
	_sps_len = inteval - offset;
	printf("sps len:%d --offset:%d \n" , _sps_len , offset);
	*_sps = new uint8_t [_sps_len+1];//這裏一定要+1否則可能回出現亂碼,+1是爲了存放最後的\0
	memcpy(*_sps,enc_ctx->extradata + offset,_sps_len);

	
	//copy pps
	_pps_len = extra_data_size - offset - _sps_len - offset;
	printf("pps len:%d \n" , _pps_len);
	*_pps = new uint8_t [_pps_len+1];
	memcpy(*_pps,extra_data + offset + _sps_len + offset,_pps_len);


	//把sps/pps信息給補齊
	char head [] {0x00,0x00,0x00,0x01};
	FILE *fs = fopen("/opt/rbu/encode_data.264","wb+");
	fwrite(head,4,1,fs);
	fwrite(_sps,_sps_len,1,fs);
	fwrite(head,4,1,fs);
	fwrite(_pps,_pps_len,1,fs);
	fclose(fs);


	fs = fopen("/opt/rbu/sps.data","wb+");
	fwrite(_sps,_sps_len,1,fs);	
	fclose(fs);

	fs = fopen("/opt/rbu/pps.data","wb+");
	fwrite(_pps,_pps_len,1,fs);
	fclose(fs);

	fs = fopen("/opt/rbu/sps_pps_extra.data","wb+");
	fwrite(enc_ctx->extradata,enc_ctx->extradata_size,1,fs);
	fclose(fs);

很簡單,簡單到什麼程度呢? 中間的數據是我需要拷貝的,但是我拷貝過來後發現和原始的數據對比,怎麼也對比不上,出現了亂碼!

解決方案是:

uint8_t *sps = new uint8_t [len+1];

也就是多分配1個字節的空間,用於存放\0.

添加後所有的數據情況都正常了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章