bug: mmap+memcpy, char 转int 又出问题了

博主在处理mmap和memcpy过程中遇到字符到整数转换的困难,描述了从char到char转换的成功,但char到int的转换出现错误,文章最后表示已解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

就没完成,

char 到char 好搞,

char 到int 好像不知道哪错了,沮丧,,,

	
	int	off_r=0;
	int	off_w=0;
	int m_size=0;//mmap size
	int page_now=0;
	filename_write="letter";
	//fd_w = open(filename_write,O_RDWR|O_CREAT|O_TRUNC|O_APPEND,0644);
	fd_w = open(filename_write,O_RDWR|O_CREAT|O_TRUNC,0644);
	assert(fd_w);

	//length_r = lseek(fd_r,0,SEEK_END);
	//length_w = lseek(fd_w,BUF_SIZE_W,SEEK_CUR);
	
	cout<<"length_r:"<<length_r<<endl;
	//cout<<"length_w:"<<length_w<<endl;
 
	lseek(fd_w,0,SEEK_SET);
	//lseek(fd_r,0,SEEK_SET);
	
	auto page=length_r/BUF_SIZE;
	auto remain=length_r%BUF_SIZE;
	cout<<"page:"<<page<<endl;
	cout<<"remain:"<<remain<<endl;

	int pagesize = sysconf (_SC_PAGESIZE);
	printf ("pagesize is %d\n", pagesize);

	int chck = write(fd_w,"0",length_r);//fix addr cannot be access 
	assert(chck);
	lseek(fd_w,0,SEEK_SET);

	while(1)
	{
		
		//m_size = (page_now <= page) ? BUF_SIZE : remain;//size of mmap 
		p_w = (int*)mmap(NULL,BUF_SIZE,PROT_WRITE|PROT_READ,MAP_SHARED,fd_w,off_w);
		//p_w = (char*)mmap(NULL,BUF_SIZE,PROT_WRITE|PROT_READ,MAP_SHARED,fd_w,off_w);

		//p_w = (char*)mmap(NULL,length_r,PROT_WRITE|PROT_READ,MAP_SHARED,fd_w,off_w);
		//p_w = (int*)mmap(NULL,length_r*4,PROT_WRITE|PROT_READ,MAP_SHARED,fd_w,off_w);
		assert(p_w);

		int data_size = BUF_SIZE/4;// int = 4bit char = 1bit
		int data_cpy[data_size]={0};//to save encrypt data from data_
		for(int i=0;i<data_size;i++)
		{			
			int tmp=(int)data_[i];//TODO:bug
			int num_ecd=(int)pow((double)tmp,sk_) % sn_; //C multiply itself sk_ times, then mod sn_
			 /*
              *int mt=data_[i];
              *for(int j=0;j< sk_;j++) mt*=data_[i];
              *int num_ecd = mt % sn_;
			  */
			data_cpy[i]=num_ecd;
			//int ecd=data_[i];
			//p_w[i]=data_[i];
		}

		memcpy(p_w,data_cpy,sizeof(data_cpy));
		cout<<"sizeof(data_cpy):"<<sizeof(data_cpy)<<endl;
		//memcpy(p_w, data_+off_r,BUF_SIZE);
		//memcpy(p_w, data_,length_r);


		off_r += (BUF_SIZE/4);
		off_w += BUF_SIZE;

		if(off_r >= length_r)
		{
			printf("===================\n");
			int final_page_size=(length_r - off_r)*4;
			off_w -= BUF_SIZE;
			p_w = (int*)mmap(NULL,final_page_size,PROT_WRITE,MAP_SHARED,fd_w,off_w);
			for(int i=0;i<final_page_size/4;i++)
			{			
				int tmp=(int)data_[i];//TODO:bug
				int num_ecd=(int)pow((double)tmp,sk_) % sn_; //C multiply itself sk_ times, then mod sn_
				data_cpy[i]=num_ecd;
				//int ecd=data_[i];
				//p_w[i]=data_[i];
			}
			memcpy(p_w,data_cpy,final_page_size);
			break;
		}

	}//while
	lseek(fd_w,0,SEEK_SET);
	length_w = lseek(fd_w,0,SEEK_END);
	printf("length_w:%lld\nlength_r:%lld\n",length_w,length_r);
	if ((msync((void *) p_w, length_w, MS_SYNC)) == -1)
		perror ("msync");
	munmap(p_w,length_w);
	munmap(data_,length_r);
	close(fd_w);

 

搞定:



	long long off_r=0;
	long long off_w=0;
	//long long page_now=0;
	int mp_size_r=0;
	int mp_size_w=0;
	filename_write="letter";
	fd_w = open(filename_write,O_RDWR|O_CREAT|O_TRUNC,0644);
	assert(fd_w);
	//set size of letter
	if((ftruncate(fd_w,length_r*4))==-1)
	{
		perror("ftruncate error");
		exit(1);
	}

	length_w = lseek(fd_w,0,SEEK_END);
	
	cout<<"length_r:"<<length_r<<endl;
	cout<<"length_w:"<<length_w<<endl;
 
	auto page=length_w/BUF_SIZE;
	auto remain=length_w%BUF_SIZE;
	cout<<"page:"<<page<<endl;
	cout<<"remain:"<<remain<<endl;

	int pagesize = sysconf (_SC_PAGESIZE);
	printf ("pagesize is %d\n", pagesize);

	//int chck = write(fd_w,"0",length_r);//fix addr cannot be access 
	//assert(chck);
	lseek(fd_r,0,SEEK_SET);
	lseek(fd_w,0,SEEK_SET);

	while(1)
	{
		//printf("total_page %lld: %lld\n",page,page_now);
		p_w = (int*)mmap(NULL,BUF_SIZE,PROT_WRITE|PROT_READ,MAP_SHARED,fd_w,off_w);
		//p_w = (char*)mmap(NULL,BUF_SIZE,PROT_WRITE|PROT_READ,MAP_SHARED,fd_w,off_w);
		//page_now++;//mark curent page num 
		//assert(p_w);//this make me debug a lot of time ,use it when you sure you can
		if(p_w == MAP_FAILED)
		{
			perror("oooOOps,mmap error");
			exit(1);
		}

		mp_size_w=BUF_SIZE;
		mp_size_r=BUF_SIZE/4;
		//printf("p_w: %p\n",p_w);
		int data_size = mp_size_r;// int = 4bit char = 1bit
		int data_cpy[data_size]={0};//to save encrypt data from data_
		for(int i=0;i<data_size;i++)
		{			
			int tmp=(int)data_[i];//TODO:bug
			data_cpy[i]=(int)pow((double)tmp,sk_) % sn_; //C multiply itself sk_ times, then mod sn_
			/*
			 *int mt=data_[i];
			 *for(int j=0;j< sk_;j++) mt*=data_[i];
			 *int num_ecd = mt % sn_;
			 */
			//data_cpy[i]=num_ecd;
		}
		memcpy(p_w,data_cpy,sizeof(data_cpy));

		off_r += mp_size_r;// BUF_SIZE/4
		off_w += BUF_SIZE;

		if(off_r >= length_r)
		{//final page
			off_w -= BUF_SIZE;//go back
			int final_page_size=length_w-off_w;
			printf("final_page_size:%d\n",final_page_size);
			p_w = (int*)mmap(NULL,final_page_size,PROT_WRITE,MAP_SHARED,fd_w,off_w);

			if(p_w==MAP_FAILED)
			{
				perror("i,mmap error");
				exit(1);
			}
			int arr_fp_size=final_page_size/4;//final page of data_
			int data_cpy_fp[arr_fp_size]={0};//to save encrypt data from data_
			for(int i=0;i<arr_fp_size;i++)
			{			
				int tmp=(int)data_[i];//TODO:bug
				data_cpy_fp[i]=(int)pow((double)tmp,sk_) % sn_; //C multiply itself sk_ times, then mod sn_
				//data_cpy_fp[i]=num_ecd;
			}
			memcpy(p_w,data_cpy_fp,final_page_size);
			mp_size_w=final_page_size;
			mp_size_r=length_r-off_r;
			break;
		}
		//if ((msync((void *) p_w,mp_size,MS_SYNC)) == -1)
		//perror ("msync");
		munmap(p_w,mp_size_w);
		//munmap(data_,mp_size_r);
	}//while
	//lseek(fd_w,0,SEEK_SET);
	//length_w = lseek(fd_w,0,SEEK_END);
	//printf("length_w:%lld\nlength_r:%lld\n",length_w,length_r);
	munmap(data_,length_r);
	//munmap(p_w,length_w);
	close(fd_w);

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值