Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从API调用返回的base64encoded字符串在运行数据(base64encoded:Data)后显示为nil_Ios_Swift_Base64_Jsondecoder - Fatal编程技术网

Ios 从API调用返回的base64encoded字符串在运行数据(base64encoded:Data)后显示为nil

Ios 从API调用返回的base64encoded字符串在运行数据(base64encoded:Data)后显示为nil,ios,swift,base64,jsondecoder,Ios,Swift,Base64,Jsondecoder,这一点我很困惑。我一直认为这是我的服务器出了问题,但经过测试,似乎使用数据(base64encoded:Data)会产生nil,即使数据存在并且实际上是base64encoded的。 我已经尝试了我能想到的一切,但没有任何效果。这是我正在使用的代码和输出 do { print("DATA as a string: ", String(data: data!, encoding: .utf8) ?? "NONE AVAILABLE") let decodedData = Data(base

这一点我很困惑。我一直认为这是我的服务器出了问题,但经过测试,似乎使用数据(base64encoded:Data)会产生nil,即使数据存在并且实际上是base64encoded的。 我已经尝试了我能想到的一切,但没有任何效果。这是我正在使用的代码和输出

do {
  print("DATA as a string: ", String(data: data!, encoding: .utf8) ?? "NONE AVAILABLE")
  let decodedData = Data(base64encoded: data!, options: .ignoreUnknownCharacters)
  print("DECODED DATA: ")
  print(decodedData as Any)
  let apiResponse = try JSONDecoder().decode(ApiConnectionResponse.self, from: decodedData!)
  completion(.success(apiResponse))
} catch {
  completion(.failure(error))
}
从中得到的输出是

数据作为字符串: EYJZDWNJZXNZIZMFSC2UILCJLCNJVCII6IM1VYMLSZV9WAW5FY29UBMVJDDOGAW52YWXPZCBVCIBLEHBPCMVKIN0

解码数据:无

所以这个字符串是一个合法的Base64编码字符串,它解码为

{“success”:“false”,“error”:“mobile_pin_connect:无效或过期”}

然而,解码数据为零。我不明白,当字符串是base64编码的字符串而不是nil时,它怎么可能是nil。 我甚至试过像这样把绳子压进去

let decodedData = Data(base64encoded: String(data: data!, encoding: .utf8))
还是不走运。它抛出了一个致命错误,我可以在Xcode底部的部分中看到数据实际上是“(数据?)92字节”我不明白的是,为什么在运行data()之后它是nil

任何帮助都将不胜感激,我真的很迷茫,不明白为什么我可以制作字符串,但不能制作数据


最终的结果是,我需要获取JSONDecoder().decode来处理服务器的回复,我想我可以完成这一部分,如果我能找出为什么在数据调用后它是nil的话。谢谢。

我想编码的数据是错的

let originalString = """
{"success":"false","error":"mobile_pin_connect: invalid or expired"}
"""

let base64string = originalString.data(using: .utf8)?.base64EncodedString()
print(base64string)

let base64EncodedData = originalString.data(using: .utf8)?.base64EncodedData()
let base64EncodedString = String(data: base64EncodedData!, encoding: .utf8)
print(base64EncodedString)

let decodedData = Data(base64Encoded: base64EncodedData!)
let decodedString = String(data: decodedData!, encoding: .utf8)
print(decodedString)
日志如下:

Optional("eyJzdWNjZXNzIjoiZmFsc2UiLCJlcnJvciI6Im1vYmlsZV9waW5fY29ubmVjdDogaW52YWxpZCBvciBleHBpcmVkIn0=")
Optional("eyJzdWNjZXNzIjoiZmFsc2UiLCJlcnJvciI6Im1vYmlsZV9waW5fY29ubmVjdDogaW52YWxpZCBvciBleHBpcmVkIn0=")
Optional("{\"success\":\"false\",\"error\":\"mobile_pin_connect: invalid or expired\"}")
根据base64规范,
不是有效字符
=
是填充的合适字符


我想编码的数据是错的

let originalString = """
{"success":"false","error":"mobile_pin_connect: invalid or expired"}
"""

let base64string = originalString.data(using: .utf8)?.base64EncodedString()
print(base64string)

let base64EncodedData = originalString.data(using: .utf8)?.base64EncodedData()
let base64EncodedString = String(data: base64EncodedData!, encoding: .utf8)
print(base64EncodedString)

let decodedData = Data(base64Encoded: base64EncodedData!)
let decodedString = String(data: decodedData!, encoding: .utf8)
print(decodedString)
日志如下:

Optional("eyJzdWNjZXNzIjoiZmFsc2UiLCJlcnJvciI6Im1vYmlsZV9waW5fY29ubmVjdDogaW52YWxpZCBvciBleHBpcmVkIn0=")
Optional("eyJzdWNjZXNzIjoiZmFsc2UiLCJlcnJvciI6Im1vYmlsZV9waW5fY29ubmVjdDogaW52YWxpZCBvciBleHBpcmVkIn0=")
Optional("{\"success\":\"false\",\"error\":\"mobile_pin_connect: invalid or expired\"}")
根据base64规范,
不是有效字符
=
是填充的合适字符


您需要检查数据长度,除以3,如果结果不是零,则添加一个或两个字节(65)
=
等号以填充数据。试着这样做:

let decodedData = Data(base64Encoded: data + .init(repeating: 65, count: data.count % 3))


操场测试:

let data = Data("eyJzdWNjZXNzIjoiZmFsc2UiLCJlcnJvciI6Im1vYmlsZV9waW5fY29ubmVjdDogaW52YWxpZCBvciBleHBpcmVkIn0.".utf8)
let decodedData = Data(base64Encoded: data.base64encodedDataPadded)!
print(String(data: decodedData, encoding: .utf8)!) // "{"success":"false","error":"mobile_pin_connect: invalid or expired"}"

您需要检查数据长度,除以3,如果结果不是零,则添加一个或两个字节(65)
=
等号以填充数据。试着这样做:

let decodedData = Data(base64Encoded: data + .init(repeating: 65, count: data.count % 3))


操场测试:

let data = Data("eyJzdWNjZXNzIjoiZmFsc2UiLCJlcnJvciI6Im1vYmlsZV9waW5fY29ubmVjdDogaW52YWxpZCBvciBleHBpcmVkIn0.".utf8)
let decodedData = Data(base64Encoded: data.base64encodedDataPadded)!
print(String(data: decodedData, encoding: .utf8)!) // "{"success":"false","error":"mobile_pin_connect: invalid or expired"}"


将base64字符串显示为在末尾有句点和换行符。这看起来不对。在线base64解码器在有或没有最后一个句点和换行符的情况下对其进行解码,但Swift可能会在适当的位置阻塞它。

您将base64字符串显示为在末尾有句点和换行符。这看起来不对。在线base64解码器在有或没有最后一个句点和换行符的情况下对其进行解码,但Swift可能会被它卡住。

您可以尝试不使用
。忽略未知字符
选项吗?这就是我最初使用它的方式,它是零。搜索后,我发现一些人说.ignoreUnknownCharacters选项正在解决这个问题,所以我尝试了一下,运气不好。你能对原始数据进行编码并检查字符串是否相同吗?你的意思是什么?你需要使用
=
填充字符串长度。你能在不使用
的情况下尝试吗?忽略未知字符
选项?我最初就是这样做的,它是零。搜索后,我发现一些人说.ignoreUnknownCharacters选项解决了这个问题,所以我尝试了它,运气不好。你能对原始数据进行编码并检查字符串是否相同吗?你的意思是什么?你需要使用
=
填充字符串长度。我在尝试打印解码数据时仍然得到零。字符串很好,正在打印(数据)显示(可选(92字节)),但decodedData的实际输出为零。我已经在操场上测试了它,没有问题。请确保您的字符串没有以句点结束,因为您在帖子中显示了句点。如果有句点,删除该句点的最佳方法是什么?是的,现在我的数据不再是零,而是显示为可选的(69字节)。非常感谢。现在我只需要弄清楚在尝试使用JSONDecoder()时错误“垃圾在末尾”是什么意思。decode@NeglectedSanity看起来您有一个以null结尾的字符串。如果数据以字节==0I结尾,您也可以使用dropLast,但在尝试使用该字节打印decodedData时,仍然得到nil。字符串很好,正在打印(数据)显示(可选(92字节)),但decodedData的实际输出为零。我已经在操场上测试了它,没有问题。请确保您的字符串没有以句点结束,因为您在帖子中显示了句点。如果有句点,删除该句点的最佳方法是什么?是的,现在我的数据不再是零,而是显示为可选的(69字节)。非常感谢。现在我只需要弄清楚在尝试使用JSONDecoder()时错误“垃圾在末尾”是什么意思。decode@NeglectedSanity看起来您有一个以null结尾的字符串。如果数据以字节==0结尾,也可以使用dropLast