【发布时间】:2015-05-17 04:04:29
【问题描述】:
今天我试图将unsigned long 变量复制到unsigned char * 变量的内容中。
原因是,我编写了一个 RC4 密码,它要求密钥输入是 unsigned char *,我使用 SYSTEMTIME 类来获取一个值并将其与随机生成的 long 值组合到获取我的 RC4 密钥 - 我将其用作用户创建帐户的时间戳,以便在我的 sqlite 数据库中进行标记。
无论如何,我遇到的问题是我无法将ULONG 复制到PUCHAR。
我试过了
wsprintfA(reinterpret_cast<LPSTR>(ucVar), "%lu", ulVar);
我试过了
wsprintfA((LPSTR)ucVar, "%lu", ulVar);
但是,在执行我的程序后,ucVar 中的结果只是空的,或者它甚至不计算,导致应用程序崩溃。
[编辑 1]
我认为memcpy 方法可能会起作用,所以我尝试声明另一个变量并将其移动到ucVar,但它仍然使应用程序崩溃 - 即它没有到达MessageBox():
unsigned char *ucVar;
char tmp[64]; // since ulVar will never be bigger than 63 character + 1 for '\0'
wsprintfA(tmp, "%lu", ulVar);
memcpy(ucVar, tmp, sizeof(tmp));
MessageBox(0, (LPSTR)ucVar, "ucVar", 0);
[/edit 1]
[编辑 2]
大小为 64 的 ucVar 上的 HeapAlloc() 解决了我的问题,感谢 ehnz 的建议!
[/edit 2]
谁能给我一些解决这个问题的方法?非常感谢!
问候, 安德鲁
【问题讨论】:
-
ucVar是如何分配的? -
未分配。它被简单地声明为 `unsigned char *ucVar;
-
@AndrewPeters - 它必须“拥有”一些内存。目前
ucVar能够存储一些内存的地址,但是除非它指向有效的内存,否则试图sprintf到它所指向的位置会导致撕裂。把它想象成财产——如果你有一张纸,上面写着地址,你可以开车到那个地方,把你喜欢的东西扔到前面的草坪上。问题是,如果你不拥有记录地址的房产,你会得到一个“你在做什么?”房主的例外。 -
@enhzflep 感谢您的类比。所以你的意思是,我应该使用
HeapAlloc()来设置ucVar的大小还是什么? -
@AndrewPeters - 不客气。是的,您应该通过 malloc、calloc 或 HeapAlloc 分配一些内存。完成此操作后,您添加的代码块中的 memcpy 将起作用。
标签: c visual-studio unsigned-char