关于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.

添加后所有的数据情况都正常了.

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