如何在 Swift 中将十六进制字符串转换为 CString?
How to convert hex string to CString in Swift?
我是 swift 的新手,我需要将 swift 中的十六进制字符串转换为 CString 以用于 c 中的 argon2 绑定。
我看过:
let saltCString = context.salt.cString(using: .utf8)
argon2id_hash_raw(UInt32(context.iterations), UInt32(context.memory), UInt32(context.parallelism), passwordCString,
passwordLength, saltCString, saltLength, &hashResult, hashLength)
但是我想传递一个密钥而不是密码,如果我传递一个十六进制字符串的盐并将 .utf8 更改为 .hex[ 是否有效? =20=]?
argon2id_hash_raw 不需要 C 字符串(以 NUL 字节结尾),而是 uint8_t 数组。因此,长度是一个单独的参数,请参阅 https://github.com/P-H-C/phc-winner-argon2/blob/master/src/argon2.c 第 136 - 137 行:
context.salt = CONST_CAST(uint8_t *)salt;
context.saltlen = (uint32_t)saltlen;
因为你在 Swift 中有一个十六进制编码的字符串,你可以使用这个很好的答案 .
将它转换为 UInt8 数组
测试
如果我们定义一个小的 C 函数只是为了测试转换,它可能看起来像这样:
#include <stdio.h>
#include "some_cfile.h"
void print_salt(const uint8_t *salt, uint32_t len) {
for(uint32_t i = 0; i < len; i++) {
printf("%x ", salt[i]);
}
printf("\n");
}
为了完整起见,测试头文件将如下所示:
#ifndef some_cfile_h
#define some_cfile_h
#include <inttypes.h>
void print_salt(const uint8_t *salt, uint32_t len);
#endif /* some_cfile_h */
从 Swift 端这将被调用如下:
struct Context {
let salt: String
}
...
let context = Context(salt: "687568")
...
let salt = context.salt.hexaBytes
print_salt(salt, UInt32(salt.count))
这个测试最终给出了预期的输出:
68 75 68
我是 swift 的新手,我需要将 swift 中的十六进制字符串转换为 CString 以用于 c 中的 argon2 绑定。
我看过:
let saltCString = context.salt.cString(using: .utf8)
argon2id_hash_raw(UInt32(context.iterations), UInt32(context.memory), UInt32(context.parallelism), passwordCString,
passwordLength, saltCString, saltLength, &hashResult, hashLength)
但是我想传递一个密钥而不是密码,如果我传递一个十六进制字符串的盐并将 .utf8 更改为 .hex[ 是否有效? =20=]?
argon2id_hash_raw 不需要 C 字符串(以 NUL 字节结尾),而是 uint8_t 数组。因此,长度是一个单独的参数,请参阅 https://github.com/P-H-C/phc-winner-argon2/blob/master/src/argon2.c 第 136 - 137 行:
context.salt = CONST_CAST(uint8_t *)salt;
context.saltlen = (uint32_t)saltlen;
因为你在 Swift 中有一个十六进制编码的字符串,你可以使用这个很好的答案
测试
如果我们定义一个小的 C 函数只是为了测试转换,它可能看起来像这样:
#include <stdio.h>
#include "some_cfile.h"
void print_salt(const uint8_t *salt, uint32_t len) {
for(uint32_t i = 0; i < len; i++) {
printf("%x ", salt[i]);
}
printf("\n");
}
为了完整起见,测试头文件将如下所示:
#ifndef some_cfile_h
#define some_cfile_h
#include <inttypes.h>
void print_salt(const uint8_t *salt, uint32_t len);
#endif /* some_cfile_h */
从 Swift 端这将被调用如下:
struct Context {
let salt: String
}
...
let context = Context(salt: "687568")
...
let salt = context.salt.hexaBytes
print_salt(salt, UInt32(salt.count))
这个测试最终给出了预期的输出:
68 75 68