- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
char *crypt_r(const char *key, const char *setting, void *data)
应该传递什么作为数据参数?我找不到这方面的文档。 Linux 版本使用 crypt_data
类型,但此 header 中不可用。
最佳答案
这是一个棘手的接口(interface),因为它想要分配并回收大小对调用者不透明的对调用者不透明的缓冲区,这在 C 中并不容易。
如果我正在阅读 OpenWall crypt(3)
manpage (PDF) 正确,您应该能够获得 crypt_data
通过定义 _GNU_SOURCE
声明的结构在包含任何系统头文件之前(不仅仅是在包含 crypt.h
之前)。或者,您可以使用 crypt_ra
,像这样的东西。 (注意:C++ <string>
和 <vector>
用于避免一堆乏味的内存分配,这会掩盖示例的重要部分。出于同样的原因,失败时崩溃行为。根本没有测试;甚至没有编译.)
#define _OW_SOURCE
#include <crypt.h>
#include <string>
#include <vector>
using std::vector;
using std::string;
void crypt_many(vector<string> &encrypted,
vector<string> const &passwords,
const char *setting)
{
void *buffer = 0;
int bufsiz = 0;
encrypted.clear();
encrypted.reserve(passwords.size());
for (auto p = passwords.begin(), limit = passwords.end();
p != limit; p++)
{
char *enc = crypt_ra(p->c_str(), setting, &buffer, &bufsiz);
if (!enc) abort();
encrypted.push_back(string(enc));
}
free(buffer);
}
第一次调用 crypt_ra
, 它使用 malloc
分配了一些内存并将其存储在 buffer
中(以及 bufsiz
中的大小),并进行一些预计算,其结果保存在 buffer
中;返回的 enc
指针也指向那里。在随后的调用中,它会重用空间和预先计算的表,如果它发现缓冲区不够大,它可能会调整缓冲区大小(这就是缓冲区大小是一个参数的原因)。你,来电者,不要碰buffer
或 bufsiz
完全没有,除了你有责任释放buffer
当你用完 crypt_ra
.
关于c - 什么是 openwall crypt_r 的数据参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43721265/
谁能给我一个关于如何使用函数 crypt_r() 的例子吗? 在手册页中,不清楚返回的 char * 字符串是指向函数本身内部(在堆中)分配的内存块,还是仍然指向静态内存,如 crypt()? 最佳答
char *crypt_r(const char *key, const char *setting, void *data) 应该传递什么作为数据参数?我找不到这方面的文档。 Linux 版本使用
我想在 Mac OS X 10.8.2 上使用 crypt_r 函数 #define _GNU_SOURCE #include 产生 crypt.h: No such file or directo
我正在尝试编写一个多线程程序,我需要在其中调用函数 crypt。但是编译器会抛出这个警告。此外,它也不识别 crypt_data。有什么想法吗? 最佳答案 您需要包含适当的头文件。在这种情况下 cry
我是一名优秀的程序员,十分优秀!