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

我得到了在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版本的排列,请参阅此问题的修订历史记录。

以上是 在Swift中将十六进制字符串转换为NSData 的全部内容, 来源链接: utcz.com/qa/426396.html

回到顶部