当前位置: 首页 > news >正文

通过uri获取文件路径手机适配

青铜版本

  return contentResolver.query(this, arrayOf(MediaStore.MediaColumns.DATA), null, null).let {if (it?.moveToFirst() == true) {val columnIndex = it.getColumnIndex(MediaStore.MediaColumns.DATA)val path = it.getString(columnIndex)it.close()return path}""}

在firebase上发现很多异常奔溃日志,部分手机获取到的 path 是空的,也就是说没有_data字段

其实有的手机通过选择图片或者文件后返回的uri并不一定是媒体uri,也可能是document uri,造成这个时候直接通过 uri查询,找不到_data字段,需要将 document uri中分离出类型和id,在拼凑成新的uri,在通过contentprovider查询,才可以查出 _data字段中真正的路径

//如果是Document类型的URI,需要进行转换
private fun getPathFromDocumentUri(uri: Uri): String? {val isDocumentUri = DocumentsContract.isDocumentUri(BaseApplication.instance, uri)if (isDocumentUri) {val docId = DocumentsContract.getDocumentId(uri)val split = docId.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()val type = split[0] // "image"val id = split[1] // "1044024"var quaryUri: Uri? = nullif ("image".equals(type)) {quaryUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;} else if ("video".equals(type)) {quaryUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;} else if ("audio".equals(type)) {quaryUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;}LogUtils.d("linlian quaryUri=$quaryUri")quaryUri?.let {val projection = arrayOf(MediaStore.Images.Media.DATA,MediaStore.Images.Media._ID)BaseApplication.instance.contentResolver.query(quaryUri,projection,MediaStore.Images.Media._ID + "=?",arrayOf<String>(id),null)?.use {cursor ->val columnNames = cursor.columnNamesLogUtils.d("linlian ", "URI: $uri")LogUtils.d("linlian ", "Total columns: ${columnNames.size}")// 遍历每一行while (cursor.moveToNext()) {
//                    val rowData = StringBuilder()// 遍历每一列
//                    for (columnName in columnNames) {
//                        val columnIndex = cursor.getColumnIndex(columnName)
//                        if (columnIndex == -1) {
//                            rowData.append("$columnName: [COLUMN_NOT_FOUND]\n")
//                            continue
//                        }
//
//                        val value = when (cursor.getType(columnIndex)) {
//                            Cursor.FIELD_TYPE_NULL -> "NULL"
//                            Cursor.FIELD_TYPE_INTEGER -> cursor.getLong(columnIndex)
//                            Cursor.FIELD_TYPE_FLOAT -> cursor.getDouble(columnIndex)
//                            Cursor.FIELD_TYPE_STRING -> cursor.getString(columnIndex)
//                            Cursor.FIELD_TYPE_BLOB -> "BLOB (${cursor.getBlob(columnIndex)?.size ?: 0} bytes)"
//                            else -> "UNKNOWN_TYPE"
//                        }
//                        rowData.append("$columnName: $value\n")
//                    }
//                    LogUtils.d("linlian", "Row ${cursor.position}:\n$rowData")val index= cursor.getColumnIndex(MediaStore.Images.Media.DATA)if(index!=-1){val path = cursor.getString(index)LogUtils.d("linlian", "!!!!!!!!!!$path")return path}LogUtils.d("linlian", "!!!!!!!!!!$index")}return null}}}return null
}

但是根据文档其实Android 10 之后是有新的字段,但是手机厂商众多,实现方式不一,还是找不到path怎么办,官方是说可以从 RELATIVE_PATH获取路径

contentResolver.query(uri, projection, null, null, null).use { cursor ->if (cursor != null && cursor.moveToFirst()) {// 获取文件名val nameIndex: Int = cursor.getColumnIndex(if (isImage) MediaStore.Images.Media.DISPLAY_NAME else MediaStore.Video.Media.DISPLAY_NAME)val displayName: String? =if ((nameIndex != -1)) cursor.getString(nameIndex) else null// 获取相对路径(可能为 null)val pathIndex: Int = cursor.getColumnIndex(if (isImage) MediaStore.Images.Media.RELATIVE_PATH else MediaStore.Video.Media.RELATIVE_PATH)val relativePath: String? =if ((pathIndex != -1)) cursor.getString(pathIndex) else nullLogUtils.d("linlian getPathFromRelativeColumn displayName=$displayName,relativePath=$relativePath")// 生成最终路径return buildPathForAndroidQ(displayName, relativePath)}}

如果以上都找不到path 怎么办呢

那最后的方式是,通过uri拷贝一份文件到应用目录,不过用完记得删除

fun copyFileFromUri(context: Context, uri: Uri, destFileName: String): File? {return try {// 打开输入流val inputStream: InputStream? = context.contentResolver.openInputStream(uri)if (inputStream == null) {return null}// 目标文件:保存在 app 的 filesDir 目录val destFile = File(context.filesDir, destFileName)val outputStream: OutputStream = FileOutputStream(destFile)// 拷贝数据val buffer = ByteArray(4096)var bytesRead: Intwhile (inputStream.read(buffer).also { bytesRead = it } != -1) {outputStream.write(buffer, 0, bytesRead)}// 关闭流inputStream.close()outputStream.close()destFile} catch (e: Exception) {e.printStackTrace()null}
}

相关文章:

通过uri获取文件路径手机适配

青铜版本 return contentResolver.query(this, arrayOf(MediaStore.MediaColumns.DATA), null, null).let {if (it?.moveToFirst() true) {val columnIndex it.getColumnIndex(MediaStore.MediaColumns.DATA)val path it.getString(columnIndex)it.close()return path}&quo…...

Ubuntu 22.04 完美安装 ABAQUS 教程:从零到上手,解决兼容问题

教程概述与安装准备 本教程详细介绍了在 Ubuntu 22.04 系统上安装 ABAQUS 2023 及 ifort 2021 的步骤,并实现用户子程序的链接。教程同样适用于 ABAQUS 2021(需相应调整文件名和路径)以及 Ubuntu 18.04 至 22.04 系统,尽管未在所有版本上测试。需要注意的是,Intel 的 One…...

雷池WAF防火墙如何构筑DDoS防护矩阵?——解读智能语义解析对抗新型流量攻击

本文深度解析雷池WAF防火墙在DDoS攻防中的技术突破&#xff0c;通过智能语义解析、动态基线建模、协同防护体系三大核心技术&#xff0c;实现从流量特征识别到攻击意图预判的进化。结合2023年金融行业混合攻击防御案例&#xff0c;揭示新一代WAF如何通过协议级漏洞预判与AI行为…...

Linux权限理解

1.shell命令以及运行原理 下面来介绍一个话题&#xff0c;关于指令的运行原理&#xff0c;这里先简单理解就可以。当我们登上Linux后&#xff1a; yxx这里称之为用户名&#xff0c;VM-8-2-centos是主机名&#xff0c;~是当前目录&#xff0c;$是命令行提示符。 其中我们把上面的…...

使用labelme进行实例分割标注

前言 最近在学习实例分割算法&#xff0c;参考b站视频课教程&#xff0c;使用labelme标注数据集&#xff0c;在csdn找到相关教程进行数据集格式转换&#xff0c;按照相关目标检测网络对数据集格式的训练要求划分数据集。 1.使用labelme标注图片 在网上随便找了几张蘑菇图片&am…...

策略模式实现 Bean 注入时怎么知道具体注入的是哪个 Bean?

Autowire Resource 的区别 1.来源不同&#xff1a;其中 Autowire 是 Spring2.5 定义的注解&#xff0c;而 Resource 是 Java 定义的注解 2.依赖查找的顺序不同&#xff1a; 依赖注入的功能&#xff0c;是通过先在 Spring IoC 容器中查找对象&#xff0c;再将对象注入引入到当…...

PromptUp 网站介绍:AI助力,轻松创作

1. 网站定位与核心功能 promptup.net 可能是一个面向 创作者、设计师、营销人员及艺术爱好者 的AI辅助创作平台,主打 零门槛、智能化的内容生成与优化。其核心功能可能包括: AI艺术创作:通过输入关键词、选择主题或拖放模板,快速生成风格多样的数字艺术作品(如插画、海报…...

软件架构评估利器:质量效用树全解析

质量效用树是软件架构评估中的一种重要工具&#xff0c;它有助于系统地分析和评估软件架构在满足各种质量属性方面的表现。以下是关于质量效用树的详细介绍&#xff1a; 一、定义与作用 质量效用树是一种以树形结构来表示软件质量属性及其相关效用的模型。它将软件的质量目标…...

XILINX DDR3专题---(1)IP核时钟框架介绍

1.什么是Reference Clock&#xff0c;这个时钟一定是200MHz吗&#xff1f; 2.为什么APP_DATA是128bit&#xff0c;怎么算出来的&#xff1f; 3.APP &#xff1a;MEM的比值一定是1:4吗&#xff1f; 4.NO BUFFER是什么意思&#xff1f; 5.什么情况下Reference Clock的时钟源可…...

ubuntu 2204 安装 vcs 2018

安装评估 系统 : Ubuntu 22.04.1 LTS 磁盘 : ubuntu 自身占用了 9.9G , 按照如下步骤 安装后 , 安装后的软件 占用 13.1G 仓库 : 由于安装 libpng12-0 , 添加了一个仓库 安装包 : 安装了多个包(lsb及其依赖包 libpng12-0)安装步骤 参考 ubuntu2018 安装 vcs2018 安装该…...

Python与去中心化存储:从理论到实战的全景指南【无标题】

Python与去中心化存储:从理论到实战的全景指南 随着区块链技术和Web3理念的兴起,去中心化存储逐渐成为构建新型互联网的核心模块之一。传统中心化存储的模式存在易被攻击、单点故障和高昂成本等问题,而去中心化存储通过分布式架构实现了更高的安全性、可靠性和数据透明度。…...

C++语言程序设计——01 C++程序基本结构

目录 编程语言一、C程序执行过程二、C基础框架三、输出语句cout换行 四、注释方法 编程语言 我们知道c是一门编程语言&#xff0c;它是在c语言的基础上发展而来&#xff0c;添加了类、对象、继承、多态等概念&#xff0c;我们可以称为它是一种面向对象编程的语言。 不过在学习…...

Unity UI中的Pixels Per Unit

Pixels Per Unit在图片导入到Unity的时候&#xff0c;将图片格式设置为Sprite的情况下会出现&#xff0c;其意思是精灵中的多少像素对应世界中的一个单位&#xff0c;默认是100 1. 对于在世界坐标中 在世界坐标中&#xff0c;一般对于Sprite的应用是Sprite Renderer组件 使…...

(十八)安卓开发中的后端接口调用详讲解

在安卓开发中&#xff0c;后端接口调用是连接移动应用与服务器的重要环节&#xff0c;用于实现数据的获取、提交和处理。本文将详细讲解安卓开发中后端接口调用的步骤&#xff0c;结合代码示例和具体的使用场景&#xff0c;帮助你全面理解这一过程。 什么是后端接口&#xff1f…...

使用freebsd-update 升级FreeBSD从FreeBSD 14.1-RELEASE-p5到FreeBSD 14.2-RELEASE

使用freebsd-update 升级FreeBSD从FreeBSD 14.1-RELEASE-p5到FreeBSD 14.2-RELEASE 先升级小版本 准备升级前&#xff0c;先把当前的小版本升级到顶&#xff0c;比如现在是FreeBSD 14.1-RELEASE-p5&#xff0c;先升级到最新的14.1版本&#xff0c;使用命令&#xff1a; # fr…...

基础排序算法(三傻排序)

1. 选择排序 原理&#xff1a;每次从未排序部分选出最小&#xff08;或最大&#xff09;元素&#xff0c;放到已排序部分的末尾。时间复杂度&#xff1a;O(n)&#xff0c;效率低但实现简单&#xff0c;适合小规模数据。 //选择排序public static void selectSort(int[] arr){i…...

五分钟了解智能体

在2025年人工智能技术全面渗透社会的背景下&#xff0c;“智能体”&#xff08;Agent&#xff09;已成为推动第四次工业革命的核心概念之一。从自动驾驶汽车到医疗诊断系统&#xff0c;从智能家居中枢到金融量化交易平台&#xff0c;智能体正在重构人类与技术交互的方式。本文将…...

【机器学习】笔记| 通俗易懂讲解:生成模型和判别模型|01

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; Yaoyao2024往期回顾&#xff1a;【科研小白系列】这些基础linux命令&#xff0c;你都掌握了嘛&#xff1f;每日一言&#x1f33c;: “脑袋想不明白的&#xff0c;就用脚想”—…...

Jieba分词的原理及应用(三)

前言 “结巴”中文分词&#xff1a;做最好的 Python 中文分词组件 上一篇文章讲了使用TF-IDF分类器范式进行企业级文本分类的案例。其中提到了中文场景不比英文场景&#xff0c;在喂给模型之前需要进行分词操作。 分词的手段有很多&#xff0c;其中最常用的手段还是Jieba库进行…...

神经网络背后的数学原理

神经网络背后的数学原理 数学建模神经网络数学原理 数学建模 标题民科味道满满。其实这篇小短文就是自我娱乐。 物理世界是物种多样&#xff0c;千姿百态。可以从不同的看待眼中的世界&#xff0c;包括音乐、绘画、舞蹈、雕塑等各种艺术形式。但这些主观的呈现虽然在各人眼中…...

常用图像滤波及色彩调节操作(Opencv)

1. 常用滤波/模糊操作 import cv2 import numpy as np import matplotlib.pyplot as plotimg cv2.imread("tmp.jpg") img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img_g cv2.GaussianBlur(img, (7,7), 0) img_mb cv2.medianBlur(img, ksize7) #中指滤波 img_bm …...

FFMPEG和opencv的编译

首先 sudo apt-get update -qq && sudo apt-get -y install autoconf automake build-essential cmake git-core libass-dev libfreetype6-dev libgnutls28-dev libmp3lame-dev libsdl2-dev libtool libva-dev libvdpau-dev libvorbis-de…...

用户登录不上linux服务器

一般出现这种问题&#xff0c;重新用root用户修改lsy用户的密码即可登录&#xff0c;但是当修改了还是登录不了的时候&#xff0c;去修改一个文件用root才能修改&#xff0c; 然后在最后添加上改用户的名字&#xff0c;例如 原本是只有user的&#xff0c;现在我加上了lsy了&a…...

【项目管理】第11章 项目成本管理-- 知识点整理

相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 项目管理知识域 知识点: (项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域) 对应:第6章-第19章 ​ ​ (二)知识笔记​ 第11章 项目成本管理 ​ 1.管理基础…...

Python中的strip()

文章目录 基本语法&#xff1a;示例&#xff1a;1. 默认移除空白字符&#xff1a;2. 移除指定字符&#xff1a;3. 不修改原字符串&#xff1a; 相关方法&#xff1a;示例&#xff1a; 注意事项&#xff1a; 在 Python 中&#xff0c; strip() 是一个字符串方法&#xff0c;用于…...

设计模式 Day 9:命令模式(Command Pattern)完整讲解与实战应用

&#x1f504; 回顾 Day 8&#xff1a;策略模式 在 Day 8 中我们讲解了策略模式&#xff1a; 用于封装多个可切换的算法逻辑&#xff0c;让调用者在运行时选择合适的策略。它强调的是“行为选择”&#xff0c;是针对“算法或行为差异”而设计。通过 PaymentStrategy、路径规划…...

【正点原子】STM32MP257 同构多核架构下的 ADC 电压采集与处理应用开发实战

在嵌入式系统中&#xff0c;ADC模拟电压的读取是常见的需求。如何高效、并发、且可控地完成数据采集与处理&#xff1f;本篇文章通过双线程分别绑定在 Linux 系统的不同 CPU 核心上&#xff0c;采集 /sys/bus/iio 接口的 ADC 原始值与缩放系数 scale&#xff0c;并在另一个核上…...

区块链从专家到小白

文章目录 含义应用场景典型特征 含义 以非对称加密算法为基础。 每个**区块&#xff08;Block&#xff09;**包含&#xff1a; ​交易数据​&#xff08;如转账记录、合约内容&#xff09;。 ​时间戳​&#xff08;记录生成时间&#xff09;。 ​哈希值​&#xff08;当前区…...

记录centos8安装宝塔过程(两个脚本)

1、切换系统源&#xff08;方便使用宝塔安装脚本下载&#xff09; bash <(curl -sSL https://linuxmirrors.cn/main.sh) 2、宝塔安装脚本在宝塔的官网 宝塔面板下载&#xff0c;免费全能的服务器运维软件 根据自己的系统选择相应的脚本 urlhttps://download.bt.cn/insta…...

DAY 42 leetcode 151--哈希表.反转字符串中的单词

题号151 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 我的解法 暴力解法&#xff0c;先将String转为字…...

[VTK] 四元素实现旋转平移

VTK 实现旋转&#xff0c;有四元数的方案&#xff0c;也有 vtkTransform 的方案&#xff1b;主要示例代码如下&#xff1a; //构造旋转四元数vtkQuaterniond rotation;rotation.SetRotationAngleAndAxis(vtkMath::RadiansFromDegrees(90.0),0.0, 1.0, 0.0);//构造旋转点四元数v…...

AI大模型:(二)2.2 分词器Tokenizer

目录 1.分词技术的发展 2.分词器原理 2.1.基于词分词 2.2.基于字符分词 2.3.基于子词分词 3.手搓Byte-Pair Encoding (BPE)分词及训练 3.1.Byte-Pair Encoding (BPE)分词原理 3.2.手搓Byte-Pair Encoding (BPE)分词器 4.如何选择已有的分词器 1. 常见子词分词器及特点…...

codeforces A. Simple Palindrome

目录 题面 代码 题面 A. 简单回文串 每个测试用例时间限制&#xff1a;1 秒 每个测试用例内存限制&#xff1a;256 兆字节 纳雷克要在幼儿园陪一些两岁的孩子度过两个小时。他想教孩子们竞技编程&#xff0c;他们的第一堂课是关于回文串的。 纳雷克发现孩子们只认识英文字母…...

Linux 进程基础(一):冯诺依曼结构

文章目录 一、冯诺依曼体系结构是什么&#xff1f;&#x1f9e0;二、冯诺依曼体系为何成为计算机组成的最终选择&#xff1f;&#xff08;一&#xff09;三大核心优势奠定主流地位&#xff08;二&#xff09;对比其他架构的不可替代性 三、存储分级&#xff1a;速度与容量的平衡…...

向量存储(VectorStore)详解

一、向量存储的核心概念 向量存储&#xff08;VectorStore&#xff09;是一种用于存储和检索高维向量数据的数据库或存储解决方案&#xff0c;特别适用于处理经过嵌入模型转化后的数据。与传统关系数据库不同&#xff0c;VectorStore 执行的是相似性搜索&#xff0c;而非精确匹…...

HCIP(网络类型)

网络类型概述 网络类型主要基于数据链路层使用的协议不同&#xff0c;导致数据包封装方式不同&#xff0c;工作方式也有所区别。根据这些特点&#xff0c;网络可以被分类为以下几种类型&#xff1a; MA网络&#xff08;多点接入网络&#xff09;&#xff1a;允许同时接入多台…...

MTCNN 人脸识别

前言 此处介绍强大的 MTCNN 模块&#xff0c;给出demo&#xff0c;展示MTCNN 的 OOP&#xff0c; 以及ROS利用 C 节点&#xff0c;命令行调用脚本执行实际工作的思路。 MTCNN Script import argparse import cv2 from mtcnn import MTCNN import osclass MTCNNProcessor:def…...

一文解析DeepSeek R1模型

1. DeepSeek R1-Zero 在训练DeepSeek R1之前&#xff0c;深度求索团队尝试做了一个DeepSeek R1-Zero的模型&#xff0c;只进行强化学习而不需要监督微调&#xff0c;以此来强化模型自我推理的能力。 通过下图回顾下ChatGPT的做法&#xff1a;首先SFT&#xff0c;然后训练奖励…...

SpringMVC基础三(json)

乱码处理 编写一个表单&#xff1a; 编写EncodingController控制类 测试&#xff1a; 此乱码是在从前端传送到test方法时就已经乱了。 采用过滤器解决乱码 在web.xml中配置SpringMVC的乱码过滤器 <filter><filter-name>encoding</filter-name><filter…...

spring boot大文件与多文件下载

一、简单大文件下载&#xff1a; /*** 下载大文件* param path 路径* param fileName 文件名* return* throws IOException*/ public static ResponseEntity<InputStreamResource> downloadFile(String path, String fileName) throws IOException {Path filePath Path…...

事务隔离级别和MVCC

事务隔离级别 mysql是一个客户端/服务器架构的软件&#xff0c;对于同一个服务器来说&#xff0c;可以有多个客户端与之连接。每个客户端与服务器连接后就形成了一个会话。每个客户端都可以在自己的会话中向服务器发出请求语句&#xff0c;一个请求语句可能是某个事务的一部分…...

Ubuntu 系统深度清理:彻底卸载 Redis 服务及残留配置

Ubuntu 系统深度清理&#xff1a;彻底卸载 Redis 服务及残留配置 在Ubuntu系统中&#xff0c;Redis是一种广泛使用的内存数据存储系统&#xff0c;用于缓存和消息传递等场景。然而&#xff0c;有时候我们需要彻底卸载Redis&#xff0c;以清理系统资源或为其他应用腾出空间。本…...

关于群晖安装tailscale后无法直链的问题

问题是我局域网的ipv6无法正确获取到ip, 通过命令可以看到ipv6没有ip tailscale netcheck C:\Users\Administrator>tailscale netcheck 2025/04/12 23:43:34 attempting to fetch a DERPMap from https://controlplane.tailscale.comReport:* Time: 2025-04-12T15:43:38.27…...

第十二章:FreeRTOS多任务创建与删除

FreeRTOS多任务创建与删除教程 概述 本教程介绍FreeRTOS多任务的创建与删除方法&#xff0c;主要涉及两个核心函数&#xff1a; 任务创建&#xff1a;xTaskCreate()任务删除&#xff1a;vTaskDelete() 实践步骤 1. 准备工程文件 复制005工程并重命名为006 2. 创建多个任务…...

JavaScript数组方法:`some()`的全面解析与应用

文章目录 JavaScript数组方法&#xff1a;some()的全面解析与应用一、some()方法的基本概念语法参数说明返回值 二、some()方法的核心特点三、基础用法示例示例1&#xff1a;检查数组中是否有大于10的元素示例2&#xff1a;检查字符串数组中是否包含特定子串 四、实际应用场景1…...

IntelliJ IDEA历史版本下载安装链接

IntelliJ IDEA | Other Versions 拿走&#xff0c;不谢O(∩_∩)O...

Rag实现流程

Rag实现流程 目录 Rag实现流程1. 加载问答链代码解释`chain_type="stuff"` 的含义其他 `chain_type` 参数选项及特点1. `map_reduce`2. `refine`3. `map_rerank`示例代码展示不同 `chain_type` 的使用其他参数类型2. 提出问题3. 检索相关文档代码解释其他参数类型4. …...

设计模式 --- 命令模式

命令模式是一种行为设计模式&#xff0c;它将请求封装成一个对象&#xff0c;从而允许你使用不同的请求、队列或日志来参数化其他对象&#xff0c;同时支持请求的撤销与恢复。 优点&#xff1a; 1.解耦调用者与接收者​​&#xff1a;输入处理无需直接调用角色方法 2.支持撤销…...

C# TCP与ip通信

一、获取本机的ip地址 // 获取本地主机名 string hostName Dns.GetHostName(); string ip "127.0.0.1"; //Console.WriteLine("本地主机名: " hostName);// 获取本地IP地址 IPAddress[] addresses Dns.GetHostAddresses(hostName); Console.WriteLine…...

如何使用 Grafana 连接 Easyearch

Grafana 介绍 Grafana 是一款开源的跨平台数据可视化与监控分析工具&#xff0c;专为时序数据&#xff08;如服务器性能指标、应用程序日志、业务数据等&#xff09;设计。它通过直观的仪表盘&#xff08;Dashboards&#xff09;帮助用户实时监控系统状态、分析趋势&#xff0…...