【问题标题】:How to copy ULONG into PUCHAR如何将 ULONG 复制到 PUCHAR
【发布时间】: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


【解决方案1】:

除非您拥有尝试使用的内存的所有权,否则各种事情都可能发生。这些范围可能从因为没有其他任何东西已经拥有该内存而被忽视的错误,到即时崩溃,再到因为其他东西在您设置它的时间和您尝试从中检索值的时间之间覆盖内存而消失的值它。

处理动态内存分配时的基本概念,但对于初学者来说却是个陷阱。

【讨论】:

    猜你喜欢
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 2021-04-07
    相关资源
    最近更新 更多