如何在 Swift 中将十六进制字符串转换为 CString?

Posted

技术标签:

【中文标题】如何在 Swift 中将十六进制字符串转换为 CString?【英文标题】:How to convert hex string to CString in Swift? 【发布时间】:2021-10-22 05:04:30 【问题描述】:

我是 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 是否有效?

【问题讨论】:

【参考方案1】:

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 中有一个十六进制编码的字符串,您可以使用这个不错的答案 https://***.com/a/43360864 将其转换为 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 中将十六进制字符串转换为 CString?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中将十六进制转换为有符号浮点数?适用于正数但不适用于负数

如何在 Swift 中将 Int 转换为字符

如何在 Swift 中将 NSURL 转换为字符串

如何在swift中将字符索引从layoutManager转换为String scale

如何在 Swift 中将此 var 字符串转换为 URL

如何在Java中将字符从字母字符转换为十六进制数字?