当前位置: 首页 > 知识库问答 >
问题:

在跨iOS版本填充数据时,数据构造函数具有不同的语义

霍伟彦
2023-03-14

下面是我拥有的poc代码:

let text = "Hello, World"
let data = text.data(using: .utf8)! as CFData
    
let newData = Data(data as NSData)
print(newData.base64EncodedString())
return true

当我在运行iOS 13或14的设备中运行该操作时,会得到以下输出:

SGVsbG8sIFdvcmxk

这是“Hello,World”的正确base64。然而,当我在iOS 12中运行完全相同的代码时,我会得到以下结果:

SAAAAAAAAAAMAAAA

这在文本(utf-8)格式中是毫无意义的,但它的十六进制是:

48 00 00 00 00 00 00 00 0c 00 00 00

所以我不确定这里发生了什么,即使它只是填零,为什么它不是一直都是零?虽然我知道我所做的是错误的,但下面的工作在所有版本上都是完美的:

print((data as Data).base64EncodedString())

我只是好奇为什么它在版本上的表现不同。文档似乎没有提到旧版本中的任何特定行为警告。

共有1个答案

曾奇略
2023-03-14

请停止处理cfdatansdata

在Swift中,将字符串转换为数据的推荐API是

let text = "Hello, World"
let data = Data(text.utf8)

print(data.base64EncodedString())

它在所有版本中都能可靠地工作,并且避免了可选的。

问题是不必要的cf-ns桥接。似乎在h后面某处插入了一个零终止符。

 类似资料:
  • 问题内容: 我正在尝试使用来自Web服务的数据填充jqGrid。我已经仔细研究了jqGrid代码和文档。我需要另一双眼睛看下面的代码,并告诉我是否缺少某些内容。 正如您将在代码中看到的那样,我将网格设置为在页面加载时或刷新期间加载。加载网格后,我再次调用Ajax以获取JSON数据并显示在网格下方的div中。 我看到了大多数预期的行为。页面加载后,网格显示加载指示器,然后启动Ajax调用,并且JSO

  • series(string $value,[ string $categories]) string $value $config = ['path' => './tests']; ​ $fileObject = new \Vtiful\Kernel\Excel($config); ​ $fileObject = $fileObject->fileName('tutorial.xlsx'); $

  • factory 辅助函数 必须 使用 factory 方法来做数据填充,因为是框架提倡的,并且可以同时为测试代码服务。 运行效率 开发数据填充时,必须 特别注意 php artisan db:seed 的运行效率,否则随着项目的代码量越来越大,db:seed 的运行时间会变得越来越长,有些项目多达几分钟甚至几十分钟。 原则是: Keep it lighting speed. 只有当 db:seed

  • 简介 Laravel 可以用 seed 类轻松地为数据库填充测试数据。所有的 seed 类都存放在 database/seeds 目录下。你可以任意为 seed 类命名,但是更应该遵守类似 UsersTableSeeder 的命名规范。Laravel 默认定义的一个 DatabaseSeeder 类。可以在这个类中使用 call 方法来运行其它的 seed 类从而控制数据填充的顺序。 编写 See

  • 问题内容: 我正在使用ajax加载数据并在DataTable中动态生成列名。我的数据表具有不同的列数,具体取决于用户的选择。(有一个下拉列表)。 例如,下拉列表中有2个选项,即“ 南部省” 和“ 北部省” 。 南部省 表有4列, 北部省 表有6列。 场景1 第一个用户选择具有4列的 Southern Province 。然后它生成的表没有错误,但是在此之后,如果用户选择具有6列的 Northern

  • 问题内容: 在C ++中,从构造函数内部调用虚拟函数时,它的行为不像虚拟函数。 我认为第一次遇到这种行为的每个人都会感到惊讶,但第二次认为这是有道理的: 只要派生的构造函数没有被执行的对象是 不是 又一个 衍生 实例。 那么如何调用派生函数呢?前提条件还没有建立的机会。例: Java和.NET完全相同,但是他们选择了另一种方式,这可能是 产生最少惊讶原则 的唯一原因吗? 您认为哪个是正确的选择?