当前位置: 首页 > 面试题库 >

在Swift中将十六进制字符串转换为NSData

龙玄天
2023-03-14
问题内容

我得到了在Objective-C中将String转换为HEX-String的代码。

- (NSString *) CreateDataWithHexString:(NSString*)inputString
{
NSUInteger inLength = [inputString length];


unichar *inCharacters = alloca(sizeof(unichar) * inLength);
[inputString getCharacters:inCharacters range:NSMakeRange(0, inLength)];

UInt8 *outBytes = malloc(sizeof(UInt8) * ((inLength / 2) + 1));

NSInteger i, o = 0;
UInt8 outByte = 0;

for (i = 0; i < inLength; i++) {
    UInt8 c = inCharacters[i];
    SInt8 value = -1;

    if      (c >= '0' && c <= '9') value =      (c - '0');
    else if (c >= 'A' && c <= 'F') value = 10 + (c - 'A');
    else if (c >= 'a' && c <= 'f') value = 10 + (c - 'a');

    if (value >= 0) {
        if (i % 2 == 1) {
            outBytes[o++] = (outByte << 4) | value;
            outByte = 0;
        } else {
            outByte = value;
        }

    } else {
        if (o != 0) break;
    }
}

NSData *a = [[NSData alloc] initWithBytesNoCopy:outBytes length:o freeWhenDone:YES];
NSString* newStr = [NSString stringWithUTF8String:[a bytes]];
return newStr;

}

我想要在Swift中也一样。任何人都可以在Swift中翻译此代码,或者在Swift中有任何简单的方法吗?


问题答案:

这是我的Data例行十六进制字符串:

extension String {

    /// Create `Data` from hexadecimal string representation
    ///
    /// This creates a `Data` object from hex string. Note, if the string has any spaces or non-hex characters (e.g. starts with '<' and with a '>'), those are ignored and only hex characters are processed.
    ///
    /// - returns: Data represented by this hexadecimal string.

    var hexadecimal: Data? {
        var data = Data(capacity: characters.count / 2)

        let regex = try! NSRegularExpression(pattern: "[0-9a-f]{1,2}", options: .caseInsensitive)
        regex.enumerateMatches(in: self, range: NSRange(startIndex..., in: self)) { match, _, _ in
            let byteString = (self as NSString).substring(with: match!.range)
            let num = UInt8(byteString, radix: 16)!
            data.append(num)
        }

        guard data.count > 0 else { return nil }

        return data
    }

}

为了完整起见,这是我Data的十六进制字符串例程:

extension Data {

    /// Hexadecimal string representation of `Data` object.

    var hexadecimal: String {
        return map { String(format: "%02x", $0) }
            .joined()
    }
}

请注意,如上所示,我通常只在十六进制表示形式和NSData实例之间进行转换(因为如果可以将信息表示为字符串,则可能一开始就不会创建十六进制表示形式)。但是您最初的问题是要在十六进制表示形式和String对象之间进行转换,因此可能看起来像这样:

extension String {

    /// Create `String` representation of `Data` created from hexadecimal string representation
    ///
    /// This takes a hexadecimal representation and creates a String object from that. Note, if the string has any spaces, those are removed. Also if the string started with a `<` or ended with a `>`, those are removed, too.
    ///
    /// For example,
    ///
    ///     String(hexadecimal: "<666f6f>")
    ///
    /// is
    ///
    ///     Optional("foo")
    ///
    /// - returns: `String` represented by this hexadecimal string.

    init?(hexadecimal string: String, encoding: String.Encoding = .utf8) {
        guard let data = string.hexadecimal() else {
            return nil
        }

        self.init(data: data, encoding: encoding)
    }

    /// Create hexadecimal string representation of `String` object.
    ///
    /// For example,
    ///
    ///     "foo".hexadecimalString()
    ///
    /// is
    ///
    ///     Optional("666f6f")
    ///
    /// - parameter encoding: The `String.Encoding` that indicates how the string should be converted to `Data` before performing the hexadecimal conversion.
    ///
    /// - returns: `String` representation of this String object.

    func hexadecimalString(encoding: String.Encoding = .utf8) -> String? {
        return data(using: encoding)?
            .hexadecimal
    }

}

然后可以像上面这样使用上面的代码:

let hexString = "68656c6c 6f2c2077 6f726c64"
print(String(hexadecimal: hexString))

要么,

let originalString = "hello, world"
print(originalString.hexadecimalString())

有关上述对早期Swift版本的排列,请参阅此问题的修订历史记录。



 类似资料:
  • 问题内容: 要将String转换为十六进制,我正在使用: 在此处投票最高的答案中对此进行了概述:在Java中将 字符串转换为十六进制 我该如何反向执行,即将十六进制转换为字符串? 问题答案: 您可以从转换后的字符串中进行重构,这是一种实现方法: 另一种方法是使用,从包: 单元测试以验证: 注:领先剥离的仅仅是必要的,因为的你的填充方法。如果您不介意将其替换为简单的,则可以将此行放在:

  • 问题内容: 在Obj-C中,我曾经使用以下命令将无符号整数n转换为十六进制字符串: 我花了很长时间尝试将其翻译成Swift语言,但未成功。 问题答案: 您现在可以执行以下操作: 注意:在此示例中,表示 字段宽度 ,表示所需的 最小 长度。在它告诉垫与领先的结果的如果需要的话。(如果没有,结果将用前导空格填充)。当然,如果结果大于两个字符,则字段长度将不会被剪裁为;它将扩展到显示完整结果所需的任何长

  • 我有十六进制字符串,例如“0x103E”,我想将其转换为整数。意思是to我尝试了但它给出了数字格式异常。我如何实现这一点?

  • 问题内容: 我编写了一个简单的程序,用于在Java中向串行端口发送和接收数据。我通过回送测试(Rx到Tx)连接串行端口设备。它工作正常。但我无法发送和接收十六进制数据到串行端口和接收串行端口。在我的设备中使用了FT232BL芯片,因此是否需要任何dll或其他库来将十六进制数据发送和接收到串行端口设备。我的代码如下。 问题答案: 十六进制: 十六进制为:

  • 我有一个像“示例”这样的字符串。我想得到十六进制格式的字符串;像这样: 请给出C#语法。

  • 问题内容: 我试图在Java中将类似“ testing123”的字符串转换为十六进制形式。我目前正在使用BlueJ。 并将其转换回去,除了向后转换,是否一样? 问题答案: 这是将其转换为十六进制的简短方法: