- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
通过执行 USD AT 命令,我得到以下响应:
00520030002E00300030002000610069007200740069006D0065002C0020003000200053004D005300200061006E0064002000300020004D00420020006F006600200064006100740061002E0020004400690061006C0020002A003100340031002A0031002300200066006F0072002000640065007400610069006C0073002E00200057006F005700210020005500730065002000520037002000610069007200740069006D006500200074006F00200067006500740020005200350035002B00310030004D0042002E004400690061006C0020002A003100330030002A0035003000310023
产生:
' R 0 . 0 0 a i r t i m e , 0 S M S a n d 0 M B o f d a t a . D i a l * 1 4 1 * 1 # f o r d e t a i l s . W o W ! U s e R 7 a i r t i m e t o g e t R 5 5 + 1 0 M B . D i a l * 1 3 0 * 5 0 1 #'
运行后:
ascii = rawHex.decode("hex")
我发现每个“有效”十六进制数字后面都有一个额外的空字符。因此,它生成的不是 52,而是 5200
我确实设法通过执行以下操作删除每个有效的十六进制数字后面的 00:
rawHex = ''.join( [ rawHex[i:i+2] for i in range(2,len(rawHex),4)] )
ascii = rawHex.decode("hex")
这会产生正确的结果:
'R0.00 airtime, 0 SMS and 0 MB of data. Dial *141*1# for details. WoW! Use R7 airtime to get R55+10MB.Dial *130*501#'
所以我的问题:我不知道为什么这样做,这是一个我还不知道的标准吗?
最佳答案
您似乎有UTF-16 - 编码数据,采用大端顺序,每个字符使用 2 个字节进行编码。对于 Latin-1 范围内的任何内容(Unicode 代码点 U+0000 到 U+00FF),最高有效字节始终为 00;您的示例数据仅包含 ASCII 范围内的字符,但我不认为情况总是如此。
您可以使用 utf-16-be
编解码器直接对其进行解码,而无需删除空字节:
>>> rawhex = '00520030002E00300030002000610069007200740069006D0065002C0020003000200053004D005300200061006E0064002000300020004D00420020006F006600200064006100740061002E0020004400690061006C0020002A003100340031002A0031002300200066006F0072002000640065007400610069006C0073002E00200057006F005700210020005500730065002000520037002000610069007200740069006D006500200074006F00200067006500740020005200350035002B00310030004D0042002E004400690061006C0020002A003100330030002A0035003000310023'
>>> rawhex.decode('hex')
'\x00R\x000\x00.\x000\x000\x00 \x00a\x00i\x00r\x00t\x00i\x00m\x00e\x00,\x00 \x000\x00 \x00S\x00M\x00S\x00 \x00a\x00n\x00d\x00 \x000\x00 \x00M\x00B\x00 \x00o\x00f\x00 \x00d\x00a\x00t\x00a\x00.\x00 \x00D\x00i\x00a\x00l\x00 \x00*\x001\x004\x001\x00*\x001\x00#\x00 \x00f\x00o\x00r\x00 \x00d\x00e\x00t\x00a\x00i\x00l\x00s\x00.\x00 \x00W\x00o\x00W\x00!\x00 \x00U\x00s\x00e\x00 \x00R\x007\x00 \x00a\x00i\x00r\x00t\x00i\x00m\x00e\x00 \x00t\x00o\x00 \x00g\x00e\x00t\x00 \x00R\x005\x005\x00+\x001\x000\x00M\x00B\x00.\x00D\x00i\x00a\x00l\x00 \x00*\x001\x003\x000\x00*\x005\x000\x001\x00#'
>>> rawhex.decode('hex').decode('utf-16-be')
u'R0.00 airtime, 0 SMS and 0 MB of data. Dial *141*1# for details. WoW! Use R7 airtime to get R55+10MB.Dial *130*501#'
在大多数情况下,UTF-16 编码的数据包括 Byte Order Mark (BOM)一开始,这实际上只是 U+FEFF ZERO WIDTH NO-BREAK SPACE字符,它告诉解码器解码时使用什么字节顺序。打印时,该字符基本上是不可见的。
您可能在这里省略了它,但如果您的数据流以字节 FE FF 开头,那么这肯定会确认您拥有大端 UTF-16 数据。如果流以 FF FE 开头,那么您将拥有 little-endian UTF-16(字节顺序交换),并且还会在错误的边界处剪切样本。
如果 BOM 存在,那么您不必手动指定字节顺序;使用 utf-16
解码就足够了:
>>> ('FEFF' + rawhex).decode('hex').decode('utf-16')
u'R0.00 airtime, 0 SMS and 0 MB of data. Dial *141*1# for details. WoW! Use R7 airtime to get R55+10MB.Dial *130*501#'
关于Python 2.7,AT命令响应,奇怪的HEX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32071231/
你好,我是 SMARTRF-05EB - 评估板的新手,我已经在 Linux 虚拟机中安装了 SDCC 和 Contiki-2.6。我能够构建此目录 contiki-2.6/contiki/examp
下面的简单代码会产生奇怪的输出: #include #include #include "/tmp/sha.h" #define DIGEST 64 //taken from coreutils
我不知道为什么 Hex 函数返回一个像 '0x41' 而不是 0x41 的字符串 我需要将 ASCII 值转换为十六进制。但我想要 0x INT 格式,而不是 '0x' 字符串。 ascii = 36
所以我试图从十六进制文件中读取,修改十六进制值,将新的十六进制值写入新文件。然后打开新文件,再次修改十六进制并重写到第三个文件。我正在对十六进制值进行非常简单的加密。 我用来阅读的函数是休闲的: ve
是否有一种惯用的方式将 Clojure 中的字符串编码和解码为十六进制?来自 Python 的示例: 'Clojure'.encode('hex') # ⇒ '436c6f6a757265' '436
下面的函数可以完美地将字符串转换为十六进制: function String2Hex(const Buffer: AnsiString): string; begin SetLength(Resu
我要做的是将 double 字符串转换为十六进制字符串,然后再转换回 double 。 以下代码将 double 字符串转换为十六进制字符串。 char * double2HexString(doub
我正在尝试将整数转换为十六进制。我找到了解决此问题的答案,例如 this ,尽管它们对我不起作用。我的意思是: 如果我拿这个: buf = "" buf += "\xda\xc7\xd9\x74\x
许多在线示例将哈希显示为十六进制表示,它们通常是自定义实现。改用 Apache Commons Base64 编码有什么问题或安全性降低吗?在阅读有关编码的内容时,通常是在如何将二进制表示为 XML
我需要存储这种类型的值 0xff0000或 0x00ff08 (十六进制颜色表示)在solidity智能合约中,并且能够在合约内将其转换为具有相同文本字符的字符串"ff0000" .我打算在 RSK
如果我有两种颜色: #ffcc00 和#334455 我如何获得这两种颜色之间的所有#hex 颜色,并逐渐排序? 最佳答案 你可以试试这个工具: http://www.colorhexa.com/ff
我的命令输出类似于 0x53 0x48 0x41 0x53 0x48 0x49。现在我需要将其存储在十六进制值中,然后将其转换为 ASCII 作为 SHASHI。 我试过的- 我尝试将十六进制值存储为
我正在使用计算 16 位 CRC 校验和的函数。 该函数生成一个包含校验和的 LONG(以 10 为基数的数字格式)。当然,这可以以十六进制等效形式打印到控制台,如下所示: printf("Check
我有一些以 INTEGER 形式提供给我的数字数据。我将它与其他数据一起插入到 SQLite 中,但当我将其写出时 INTEGER 数字需要为 8 位 Hex 数字,前导零。 例如 输入 400 80
在尝试附加数据对象转换为十六进制值后,我有如下代码,但它给了我以下错误: Unexpectedly found nil while unwrapping an Optional value let n
我有三个程序。程序A的代码如下: #include "stdafx.h" #include #include #include using namespace std; int _tmain(
我得到了这段代码,它从十六进制转换为 base64,反之亦然。我从另一个 SO 问题中得到了 to_base64,然后我通过一些猜测和反复试验编写了 to_hex。 class String de
我有一些关于控制建筑物访问的磁卡的信息,并且需要对软件在卡上存储数据的方式进行逆向工程,以制作具有更多功能的东西。 (我们已经和原来的程序员失去了联系。) 我不知道如何编写订单;我不是磁卡专家。 我知
我想在我拥有的 HEX 文件中找到模式并按出现次数对它们进行排序。 我不是在寻找某种特定的模式,只是为了对那里发生的事件进行一些统计并对其进行排序。 DB0DDAEEDAF7DAF5DB1FDB1DD
我在出示卡片时从 RFID 阅读器接收字节,但我无法弄清楚如何从这些字节中获取卡 ID。 例如,我有一张卡片,上面印有这些数字: 0007625328 116,23152 .我希望这是那张卡的 ID,
我是一名优秀的程序员,十分优秀!