【问题标题】:How to convert hex string to CString in Swift?如何在 Swift 中将十六进制字符串转换为 CString?
【发布时间】: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 是否有效?

【问题讨论】:

    标签: c swift hash c-strings argon2-ffi


    【解决方案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://stackoverflow.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

    【讨论】:

      猜你喜欢
      • 2013-02-07
      • 2014-08-05
      • 2014-12-17
      • 1970-01-01
      • 2017-08-23
      • 2014-03-19
      • 2011-08-25
      • 2014-04-28
      相关资源
      最近更新 更多