从指定内存地址中读取字符串的乱码问题,解决马上结贴!

jsjwql 2006-06-29 08:57:10
我有一个函数
WriteBytes(const void *buf, int cnt)
其中
buf:Pointer to the bytes to write out
cnt:length of buffer (which is treated as the number of bytes to write)

我想用以下的方法把buf里面的字符串读出来
cstring m_str;
m_str.Format(_T("%s"), (ACHAR *)buf);

TCHAR *p = (TCHAR *)buf;

char *p1 = (char *)buf;
等都失败了,得出的是乱码


请问这是什么原因,请指教,谢谢!
...全文
756 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
booklove 2006-06-30
  • 打赏
  • 举报
回复
buf里的内容你事先知道吗?
指针是不会骗人的,那块内存就是那些东西。
jackchen_01 2006-06-30
  • 打赏
  • 举报
回复
用memcpy()
jsjwql 2006-06-29
  • 打赏
  • 举报
回复
alon9有点道理“先知道这种编码与ascii之间的转换关系”
我查看的内容就是
sV磷t A怱QP??!5QI%1@LPA撜P??Y9=I@LP@j@??羨
al0n9 2006-06-29
  • 打赏
  • 举报
回复
要查看buf里的内容,你只需要在watch窗口里输入(char *)buf就可以。

按你现在的描述,我觉得buf里实际存放就是“@ɮ콐绺Hɮクɮ”这样你所谓的乱码。实际上我觉得这不是乱码,应该是一种特殊编码的字符集。要想把这种特殊编码的字符串还原成ASCII编码,得先知道这种编码与ascii之间的转换关系。没有现成的函数或者转换方法。
hjf80531 2006-06-29
  • 打赏
  • 举报
回复
view-->debug-->memory..查看内存
jsjwql 2006-06-29
  • 打赏
  • 举报
回复
al0n9(al0n9),我的意思是,现在我知道buf的地址 也知道里面放的是字符,然后想要把buf这个指针所指向内存里面的数据得出来,得到了一些乱码。以为是字符转换的问题,所以试试用以上的一些方法其他字符来转换。根据上面兄弟们的一些指导可能是字符串没有以‘\0’结束,我就加上,但是得到的还是乱码。
我也想看看buf里面放的是什么,但是watch 来观察buf的话。只能看到地址,观察 *buf的话只显示void。看不到实际内存是怎么存放的
swimmer2000 2006-06-29
  • 打赏
  • 举报
回复
WriteBytes(const void *buf, int cnt)
其中
buf:Pointer to the bytes to write out
cnt:length of buffer (which is treated as the number of bytes to write)

你根本就没有用到cnt变量,
所以你要确保buf指向的字符串是以0结尾的.
al0n9 2006-06-29
  • 打赏
  • 举报
回复
》》我想用以下的方法把buf里面的字符串读出来
什么叫做“读出来”?你要达到什么样的目的?你最好是表达清楚了。

至于你后来用的:
TCHAR *p = (TCHAR *)buf;

char *p1 = (char *)buf;
这几种方法,只是新定义了一个指针变量指向buf,buf里原来是什么内容,现在仍然是什么内容。只不过由于你定义的指针变量的类型不同,所以,对buf里的内容的表达方面会有不同,但实际存放的内容,不会有任何改变。
你在函数进入的地下设断点,然后看一下buf里的内容是什么。
hjf80531 2006-06-29
  • 打赏
  • 举报
回复
#ifdef _DEBUG
char szTemp[1024];
szTemp[WideCharToMultiByte( CP_ACP, 0, m_FilePath, lstrlen(m_FilePath), szTemp, 1023, NULL, NULL )] = 0;
#endif
如果你要看的内容是宽字节的话..用上面的方法转换一下才能用断点看
写的时候看一下..读出来的时候也看一下.
jsjwql 2006-06-29
  • 打赏
  • 举报
回复
设断点看不到任何东西,除了内存地址和乱码外
wanderfox 2006-06-29
  • 打赏
  • 举报
回复
你在转换之前设置一个中断吧,在中断处看看你要转的内容是不是你要的
jsjwql 2006-06-29
  • 打赏
  • 举报
回复
hjf80531,msdn确实没有ACHAR,我用的是arx编程,函数是autodesk提供的
写的函数类型为:
virtual Adesk::Boolean
text(

const AcGePoint3d& position,

const AcGeVector3d& normal,

const AcGeVector3d& direction,

const ACHAR* pMsg,

const Adesk::Int32 length,

const Adesk::Boolean raw,

const AcGiTextStyle & pTextStyle) const = 0;

position Input start or insertion point for the text
normal Input normal for the plane to contain the text
direction Input direction the text will go
pMsg Input text string to display
length Input length
raw Input Boolean informing AutoCAD whether to interpret escape codes
pTextStyle Input AcGiTextStyle object describing the desired text characteristics
jsjwql 2006-06-29
  • 打赏
  • 举报
回复
谢谢楼上的,我试了,还是不行,这里好像不是'\0'的问题
du51 2006-06-29
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void WriteBytes(const void *buf, int cnt)
{
char *temp=(char*)malloc((cnt+1)*sizeof(char)),*p;
/*TCHAR时注意用相应的函数就行了*/
if(!temp)exit(1);
strncpy(temp,(char*)buf,cnt);
temp[cnt]=0;
printf("%s\n",temp);
free(temp);
}
int main()
{
char *p="Hello World!",q[]={48,49,50,2,3,4};
void *buf=(void*)p;
WriteBytes(buf,5);
WriteBytes((void*)q,5);
system("PAUSE");
return 0;
}
hjf80531 2006-06-29
  • 打赏
  • 举报
回复
弱弱的问一下:ACHAR是什么类型?也是宽字节?我在MSDN中没有查到.
在问一下.你写的时候也是用宽字节的吗?
jsjwql 2006-06-29
  • 打赏
  • 举报
回复
我这是从一个文件中提取出一些数据,我也不知道具体是怎么写进去的,只知道字符串是ACHAR * 写进去的。
d_bc 2006-06-29
  • 打赏
  • 举报
回复
如果buf确确实实指向了字符串,应该是能够成功输出来的。

buf是以'\0'结尾吗?
或者那块内存已经成功输出了,它里面存的东西是那些奇怪的字符串呢。

jsjwql 2006-06-29
  • 打赏
  • 举报
回复
那写的时候应该注意写什么呢?
力为 2006-06-29
  • 打赏
  • 举报
回复
可能是写的问题,根本不是读出错了
jsjwql 2006-06-29
  • 打赏
  • 举报
回复
谢谢,我只是debug看看能不能得到结果m_str.Format(_T("%s"), (ACHAR *)buf);
这个没成功后,我就尝试用TCHAR *p = (TCHAR *)buf; 和TCHAR *p = (TCHAR *)buf; 这两种方法转化看看都没成功。
加载更多回复(3)

64,681

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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