【问题标题】:Hex to ASCII string conversion on the fly动态的十六进制到 ASCII 字符串转换
【发布时间】:2016-07-10 19:22:37
【问题描述】:

我很想知道是否有可能读取包含十六进制值的表的记录,并在显示/使用它们作为结果之前将它们即时转换为字符串数据类型(如示例图片中所示,其中原始数据显示在左侧,程序如何解释它在右侧)。

数据取自 MS Dynamics NAV v5 (SP1) ERP 软件...

另外,我想知道是否有可能设置一个可以输入为字符串的条件(例如 where)(例如 where something like 'OS%')和 DBMS 可以将其转换为十六进制并在表中搜索以缩小查询的最终结果。

提前感谢大家的宝贵时间。

【问题讨论】:

  • 那不是 ASCII。 M 的十六进制是 4D 而不是 B6
  • 这看起来像是某种专有的二进制格式。里面有ascii。 ID BRA-M02 是 4252412D4D3032 零件。但剩下的不是“机器中心:”。您需要有关此二进制文件的任何来源的文档,以便您可以正确解释它。据你所知,其中一些可能是二进制编码的十进制,一些可能是校验和,一些可能是长度值等。
  • 我想你是对的,因为当我尝试使用 RapidTables 在线 HEX 到 ASCII 转换器时,我得到的“解码”结果是七个乱码,后面跟着 "BRA-M02" 然后是另外三个奇怪的字符...
  • 也许第一个字节与前缀字典有关?
  • 这可能会很好......如果我能从字符串中“获取”文档编号,我会很高兴......第 10 行下的那个对我来说是最重要的...因此,如果我可以将其从十六进制转换为 ASCII,然后从任何前缀和后缀之间“剪切”文档编号,那就太好了!

标签: sql-server dynamics-crm


【解决方案1】:

根据您的信息,本专栏来自 Microsoft Dynamics NAV,听起来很清楚。

MSDN documentation 这么说:

指定链接附加到的记录。

使用以下语法:

<table name>: <primary key1>, <primary key2>, <primary key3>

我很确定,Microsoft 对此值有一个组合架构,这有点奇怪,但我认为并不难搞定。

如果您将值拆分为FF,您可以看到两个结果:

--0xB6A1E6050089FF4252412D4D3032000000
select convert(int,0xB6A1E6050089FF) -- Object_ID for the specified table
select convert(varchar(100),0x4252412D4D3032000000) -- Primary Key 1

您可以尝试更进一步并在您的机器上执行此操作:

select object_name(convert(int,0xB6A1E6050089FF))

这应该给你一个有效的表名。希望。 ;-)

我无法检查这一点,因为我还没有安装那些系统。如果是这样,我可以在这个结果中添加一个简短的命令来为你自动分割。

您的其他字符串可以这样拆分:

--0x1E150000008B000000000089FF534F3030303133353532000087102700000000
SELECT convert(int,0x1E150000008B000000000089FF) -- 35327 (object_id)
SELECT convert(varchar(100),0x534F30303031333535320000) -- SO00013552
SELECT convert(int,0x87102700000000) -- 0

我认为,您需要动态解析它。您应该检查基表(第一部分)。之后,检查主键的顺序。检查后,您可以将它们动态解析为目标格式。唯一可能有点困难的是分裂的部分。通常第一部分应该一直到FF。之后,每个部分都可以被多个零分割。

【讨论】:

  • 嘿!我试过了-它在某种程度上起作用了^_^我需要在早上进一步探索它(因为在我的时区已经很晚了),但是你们给了我方向和希望......只有一个更多信息,你怎么知道在哪里分割一个十六进制字符串......例如,我如何分割从我上面留下的示例图像的第 4 行截取的这个长字符串:0x1E150000008B000000000089FF534F3030303133353532000087102700000000 谢谢你无数次!一旦我发现了什么,我会回来的......
  • 也许这可以像上面的例子一样拆分(我编辑了它)。
  • 我也添加了一个拆分示例。顺便说一句,我的时钟显示 23:15。这里也快黑了。 ;-)
  • 成功了!我已经设法得到了想要的结果,它背后的代码并没有那么整齐地放在一起......但它确实完成了工作。这里是:SELECT TOP 1000 [Link ID], [Record ID], convert(varchar(100),SUBSTRING([Record ID],8,8)) as [Fixed Asset No] FROM [MyDbName].[dbo] .[Record Link] where [Record ID] like '' + convert(varchar,0xE01500000089FF) + '%' order by [link id]
  • 在我看来不是最好的实现,但无论如何你必须处理它。很高兴看到它对您有所帮助。
猜你喜欢
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
  • 2018-05-26
  • 2014-06-22
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 2012-01-24
相关资源
最近更新 更多