gpt4 book ai didi

objective-c - 如何将十六进制字符串转换为字节

转载 作者:行者123 更新时间:2023-11-28 07:28:04 26 4
gpt4 key购买 nike

如何将十六进制字符串转字节和字节转十六进制字符串?我有 oc 代码,但我不能快速编写你能帮我吗 ?非常感谢

+ (NSData *)convertHexToDataBytes:(NSString *)hexStr {
NSMutableData *dataBytes = [NSMutableData data];
int idx;
for (idx = 0; idx + 2 <= hexStr.length; idx += 2) {
NSRange range = NSMakeRange(idx, 2);
NSString *singleHexStr = [hexStr substringWithRange:range];
NSScanner *scanner = [NSScanner scannerWithString:singleHexStr];
unsigned int intValue;
[scanner scanHexInt:&intValue];
[dataBytes appendBytes:&intValue length:1];
}
return dataBytes;
}

+ (NSString *)convertDataBytesToHex:(NSData *)dataBytes {
if (!dataBytes || [dataBytes length] == 0) {
return @"";
}
NSMutableString *hexStr = [[NSMutableString alloc] initWithCapacity:[dataBytes length]];
[dataBytes enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {
unsigned char *dataBytes = (unsigned char *)bytes;
for (NSInteger i = 0; i < byteRange.length; i ++) {
NSString *singleHexStr = [NSString stringWithFormat:@"%x", (dataBytes[i]) & 0xff];
if ([singleHexStr length] == 2) {
[hexStr appendString:singleHexStr];
} else {
[hexStr appendFormat:@"0%@", singleHexStr];
}
}
}];
return hexStr;
}

我是这样写的 swift

    class func convertHex(toDataBytes hexStr: String?) -> Data? {
var dataBytes = Data()
var idx: Int
idx = 0
while idx + 2 <= (hexStr?.count ?? 0) {
let range = NSRange(location: idx, length: 2)
let singleHexStr = (hexStr as NSString?)?.substring(with: range)
let scanner = Scanner(string: singleHexStr ?? "")
var intValue: UInt
scanner.scanHexInt32(&UInt32(intValue))
dataBytes.append(&intValue, count: 1)
idx += 2
}
return dataBytes
}

它的错误是:无法将不可变值作为 inout 参数传递:函数调用返回不可变值如何解决?

最佳答案

回答您的直接问题:UInt32(intValue) 创建一个新的(常量)值,其地址不能用 & 获取。所以

var intValue: UInt
scanner.scanHexInt32(&UInt32(intValue))

应该是

var intValue: UInt32 = 0
scanner.scanHexInt32(&intValue)

dataBytes.append(&intValue, count: 1)

无法编译,因为 &intValue 是一个指向整数的指针,而不是指向 UInt8 的指针。在这里你可以做

dataBytes.append(UInt8(intValue))

因为该值已知适合单个字节。

话虽如此,所有从 StringNSString 的转换都是不需要的。将该 Objective-C 代码更“swift ”地转换为 Swift 将是

func convertHex(toDataBytes hexStr: String) -> Data {
var dataBytes = Data()
var startPos = hexStr.startIndex
while let endPos = hexStr.index(startPos, offsetBy: 2, limitedBy: hexStr.endIndex) {
let singleHexStr = hexStr[startPos..<endPos]
let scanner = Scanner(string: String(singleHexStr))
var intValue: UInt32 = 0
scanner.scanHexInt32(&intValue)
dataBytes.append(UInt8(intValue))
startPos = endPos
}
return dataBytes
}

另一种方法(包括错误检查)参见示例 hex/binary string conversion in Swift

关于objective-c - 如何将十六进制字符串转换为字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55824694/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com