简单问题:数据拼接分解。 DWORD与char* 。

neicole 2012-09-08 09:45:13
大家好,我想实现一个将数据拼接和分解的功能,将两个不同类型的数据用一个char*(连续的内存)来存放。

如:

class data{
private:
DWORD first;
char * second;
char * combine;
public:
void combineBoth(); // combineBoth()里面实现的是 combine = first + second 的数据。
void separateEither(); // separateEither()里面实现的是 first = combine(0~3), second = combine(4~n);
};


想将 first转为char*但是又不想将它转为char* 的ASCII表示,想以内存原样转过去。
是不是有哪些内存复制的方法可以实现的呢?
实际上就是想将内存地址获取一下,最好是能combine的内存地址的下几个位置就到了second的内存地址中去了。
...全文
445 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
neicole 2012-09-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
内存占用大小是一样,
char,unsigned char都是一个字节.
但是表示值范围不一样.
char的表示值在-128 - 127之间
unsigned char 0 - 255之间.
[/Quote]

噢,明白啦,谢谢,问题解决啦~


结贴~ 
zwfgdlc 2012-09-08
  • 打赏
  • 举报
回复
内存占用大小是一样,
char,unsigned char都是一个字节.
但是表示值范围不一样.
char的表示值在-128 - 127之间
unsigned char 0 - 255之间.

neicole 2012-09-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
DWORD合并到char*结果是不可预料的,DWORD是无符号,char是有符号.
把char改成unsigned char.
[/Quote]

看得不太懂,弱弱地再问一下~

其实我的combine只想作为一个中介的作用,并不会直接使用,这样也会存在符号问题的吗?因为就我理解的话,在内存中只要是占了四个字节就可以了,不管怎么是有符号无符号都是四个字节。
zwfgdlc 2012-09-08
  • 打赏
  • 举报
回复
DWORD合并到char*结果是不可预料的,DWORD是无符号,char是有符号.
把char改成unsigned char.
比如这样

DWORD a = 0x12345678;
UCHAR s[20] = "abcdefg";
memcpy(s+strlen((char*)s), &a, sizeof(a));

这样结果就是这样
s[0] = 'a'
s[1] = 'b'
s[2] = 'c'
s[3] = 'd'
s[4] = 'e'
s[5] = 'f'
s[6] = 'g'
s[7] = 0x78
s[8] = 0x56
s[9] = 0x34
s[10] = 0x12
neicole 2012-09-08
  • 打赏
  • 举报
回复
测试代码:

#include <iostream>
#include <Windows.h>
#include <string.h>
using namespace std;

class data
{
public:
DWORD first; // 四个字节
char * second;
char * combine;
public:
data();
void combineBoth(); // combineBoth()里面实现的是 combine = first + second 的数据。
void separateEither(); // separateEither()里面实现的是 first = combine(0~3), second = combine(4~n);
void displayAllData();
};

data::data(){
first = 9999;
second = new char[10];
combine = new char[14];
const char * temp = "123456789"; // 这里会有结束符
strcpy(second, temp);
}

void data::combineBoth(){
memcpy( (void*)combine, (void *) &first, 4);
memcpy( (void*)(combine+4), (void*)second, 10);
}

void data::separateEither(){
memcpy( (void *) &first, (void*)combine, 4);
memcpy( (void*)second, (void*)(combine+4), 10);
}

void data::displayAllData()
{ cout << "first:____" << first << endl;
cout << "second:____" << second << endl;
cout << "combine:____" << combine << endl;
}


int main(){
cout << "初始化\n";
data * myData = new data();
myData -> displayAllData();

cout << "\n合并\n";
myData -> combineBoth();
myData -> displayAllData();

cout << "\n分解\n";
myData->first = 0;
myData -> separateEither();
myData -> displayAllData();

system("pause");
return 0;
}


运行结果:
初始化
first:____9999
second:____123456789
combine:____屯屯屯屯屯屯屯铪铪铪

合并
first:____9999
second:____123456789
combine:____'

分解
first:____9999
second:____123456789
combine:____'
请按任意键继续. . .


这样是不是成功了? 
有什么方法可以看见combine内存下每一个字节的内容呢?
neicole 2012-09-08
  • 打赏
  • 举报
回复
void *memcpy( void *to, const void *from, size_t count );
char *strncpy( char *to, const char *from, size_t count );

谢谢大家,那我先试试 memcpy ~ 话说,一定要强制转换的么? 在线中。。。 

还有就是有没有办法,直接将 combine和second的地址连接起来呢?这样可以节省一下内存,但是如果直接
second = (char*)combine+3 会不会导致一些什么问题出现呢?
看不见的裂痕 2012-09-08
  • 打赏
  • 举报
回复
strcpy和memcpy都可以吧。

不过要复制两份。
schlafenhamster 2012-09-08
  • 打赏
  • 举报
回复
想将 first转为char*
(char*)&first
zwfgdlc 2012-09-08
  • 打赏
  • 举报
回复
memcpy不行吗?

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧