我想要在Swift中使用数据值的十六进制表示.
最终我想要像这样使用它:
let data = Data(base64Encoded: "aGVsbG8gd29ybGQ=")!
print(data.hexString)
Run Code Online (Sandbox Code Playgroud) 当我调用-description
一个NSData
对象时,我看到一个NSData
对象字节的十六进制字符串,如:
<f6e7cd28 0fc5b5d4 88f8394b af216506 bc1bba86 4d5b483d>
Run Code Online (Sandbox Code Playgroud)
我希望将数据的这种表示(减去lt/gt引号)放入内存中,NSString
这样我就可以使用它.我不想调用-[NSData description]
然后只修剪lt/gt引号(因为我认为这不是NSData
公共界面的保证方面,并且将来会发生变化.
将NSData
对象表示为NSString
对象(除了调用之外-description
)的最简单方法是什么?
我以前在Swift 4.2中使用以下代码来生成ID:
public static func generateId() throws -> UInt32 {
let data: Data = try random(bytes: 4)
let value: UInt32 = data.withUnsafeBytes { $0.pointee } // deprecated warning!
return value // + some other stuff
}
Run Code Online (Sandbox Code Playgroud)
withUnsafeBytes
在Swift 5.0上已弃用。我该如何解决?
使用hhx而不是x有什么用,在下面的代码中,mac_str是char指针而mac是uint8_t数组,
sscanf(mac_str,"%x:%x:%x:%x:%x:%x",&mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]);
Run Code Online (Sandbox Code Playgroud)
当我尝试上面的代码时它发出警告,
warning: format ‘%x’ expects argument of type ‘unsigned int *’, but argument 8 has type ‘uint8_t *’ [-Wformat]
Run Code Online (Sandbox Code Playgroud)
但我在他们指定的一些代码中看到了
sscanf(str,"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",&mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]);
Run Code Online (Sandbox Code Playgroud)
哪个不给任何警告
但两者都是一样的,使用hhx而不是x的需要是什么,我在网上搜索但没有直接回答
我正在构建一个社交媒体应用程序,我想帮助在Swift中将密码字符串编码为SHA512.我在GitHub上找到了CryptoSwift库,但我很难将它加载到我的Swift项目中并将其链接到我的项目文件.有谁知道如何相对容易地完成这个?先谢谢你,凯尔
我已更新为swift 5,并且我使用的依赖项之一不会在swift 5中编译。我已修复它,但现在我在整个文件中收到350多个弃用警告。它们都与此类似:
withUnsafeMutableBytes
不推荐使用:withUnsafeMutableBytes<R>(_: (UnsafeMutableRawBufferPointer) throws -> R) rethrows -> R
改用
这是代码的伪装(基本上只是调用ac库的函数):
var k = Data(count: crypto_generichash_keybytes())
k.withUnsafeMutableBytes { kPtr in
flutter_sodium.crypto_generichash_keygen(kPtr)
}
Run Code Online (Sandbox Code Playgroud)
作为参考,在上面的crypto_generichash_keybytes()中仅返回一个size_t,其crypto_generichash_keygen
签名为void crypto_generichash_keygen(unsigned char k[crypto_generichash_KEYBYTES]);
。
我发现(如该答案所述)解决该问题的方法应该是调用kPtr.baseAddress:
var k = Data(count: crypto_generichash_keybytes())
k.withUnsafeMutableBytes { kPtr in
flutter_sodium.crypto_generichash_keygen(kPtr.baseAddress)
}
Run Code Online (Sandbox Code Playgroud)
因为那应该使用withUnsafeMutableBytes<ResultType>
变量而不是不推荐使用withUnsafeMutableBytes<ResultType, ContentType>
。但是,这会导致错误
类型'UnsafeMutablePointer <_>'的值没有成员'baseAddress'。
如果我明确指定resultType和kPtr:
var k = Data(count: crypto_generichash_keybytes())
k.withUnsafeMutableBytes { (kPtr: UnsafeMutableRawBufferPointer) -> Void in
flutter_sodium.crypto_generichash_keygen(kPtr.baseAddress)
}
Run Code Online (Sandbox Code Playgroud)
我反而得到
UnsafeMutableRawBufferPointer'不可转换为'UnsafeMutablePointer <_>'。
有没有敏捷的专家可以帮助我找到正确的方法来做到这一点?我知道警告只是警告,但是我更喜欢编译没有警告的代码。
我看了一下Swift 5.0:不赞成使用'withUnsafeBytes':在发布此问题之前使用`withUnsafeBytes …
我基本上是在尝试使用String并在php中执行以下操作:
$signature= base64_encode(hash_hmac('sha1', $data, $secretKey, true));
Run Code Online (Sandbox Code Playgroud)
但是,在Swift中进行操作 ...我看到很多关于其他人试图使用CommonCrypto进行操作的帖子,但是该模块似乎没有安装。
所以确实有3个问题:
我当前的代码如下所示:
var authString:String = "PUT\nTEST=BLAH\nTEST2=BLAHBLAHBLAH"
let hmacResult:String = authString.sha1()
...
extension String {
func sha1() -> String {
//Do Something...
}
}
Run Code Online (Sandbox Code Playgroud) 在SDK8.3之前我用这种方式生成了我的hmac.现在我在CCHmac()函数上出错了.由于我是初学者,我无法弄清楚如何解决它.在此先感谢您的帮助!
xcode警告:不能用类型的参数列表(UInt32,[CChar] ?, UInt,[CChar] ?, UInt,inout [(CUnsignedChar)]来'CCHmac'
func generateHMAC(key: String, data: String) -> String {
let cKey = key.cStringUsingEncoding(NSUTF8StringEncoding)
let cData = data.cStringUsingEncoding(NSUTF8StringEncoding)
var result = [CUnsignedChar](count: Int(CC_SHA512_DIGEST_LENGTH), repeatedValue: 0)
CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA512), cKey, strlen(cKey!), cData, strlen(cData!), &result)
let hash = NSMutableString()
for var i = 0; i < result.count; i++ {
hash.appendFormat("%02hhx", result[i])
}
return hash as String
}
Run Code Online (Sandbox Code Playgroud) 我以前在obj-c中所做的事情:
unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];
Run Code Online (Sandbox Code Playgroud)
我在swift中尝试过的东西在Swift中发现了unsigned char:
let cHMAC = [CUnsignedChar](count: CC_SHA1_DIGEST_LENGTH)
Run Code Online (Sandbox Code Playgroud)
但是,这不会建立,因为调用中需要额外的参数
有什么想法可以快速翻译第一个代码吗?
func SHA256() -> String {
let data = self.data(using: String.Encoding.utf8)
let res = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH))
CC_SHA256((data! as NSData).bytes, CC_LONG(data!.count), UnsafeMutablePointer(res!.mutableBytes))
let hashedString = "\(res!)".replacingOccurrences(of: "", with: "").replacingOccurrences(of: " ", with: "")
let badchar: CharacterSet = CharacterSet(charactersIn: "\"<\",\">\"")
let cleanedstring: String = (hashedString.components(separatedBy: badchar) as NSArray).componentsJoined(by: "")
return cleanedstring
}
Run Code Online (Sandbox Code Playgroud)
我需要将字符串编码为UTF-16LE(稍后转换为sha1),但我遇到了一些问题.这是我试过的:
let utf16array = Array("password".utf16)
print(utf16array)
// [112, 97, 115, 115, 119, 111, 114, 100]
Run Code Online (Sandbox Code Playgroud)
但这正是我所期待的:
// [112, 0, 97, 0, 115, 0, 115, 0, 119, 0, 111, 0, 114, 0, 100, 0]
Run Code Online (Sandbox Code Playgroud)
使用utf8array也一样:
let utf8array = "password".utf8.map({ $0 as UInt8 })
// [112, 97, 115, 115, 119, 111, 114, 100]
Run Code Online (Sandbox Code Playgroud)
所以,这就是我所做的"修复"它:
var bytesArray:[UInt16] = []
for byte in utf16array {
bytesArray.append(byte)
bytesArray.append(0)
}
print(bytesArray)
// [112, 0, 97, 0, 115, 0, 115, 0, 119, 0, 111, 0, 114, 0, …
Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个项目(速度为3/4),在该项目中,我需要哈希格式如下的HTTP请求:
{"request": {"method": "getMyPeople",
"params": {"api_key": 00de5089d590e413807343166da22a45,
"user_id": 8 }, "id": "1"}}
Run Code Online (Sandbox Code Playgroud)
我试图散列SHA-256用密钥,一些看起来是这样的:
6b107c7ebebf056e1c45924d0546d35e
Run Code Online (Sandbox Code Playgroud)
我需要的:
是)我有的:
我尝试过的解决方案: 我最近的尝试是Zaph的帖子(/sf/answers/2747494431/)。
当我的问题时: 我的问题似乎发生时,我尝试的形式转化
hashSHA256: <aabc766b 6b357564 e41f4f91 2d494bcc bfa16924 b574abbd ba9e3e9d a0c8920a>
Run Code Online (Sandbox Code Playgroud)
在Zaph的帖子看到,他们把它以这种形式,我需要它在十六进制字符串的形式。
如果有人需要进一步澄清,请告诉我。预先感谢您的帮助!