【问题标题】:Decode Hex string to UTF-16?将十六进制字符串解码为 UTF-16?
【发布时间】:2020-01-18 12:55:01
【问题描述】:

我正在尝试理解并从数据库中提取数据。关键信息似乎在其中一个表中编码为十六进制字符串。当我尝试将其转换为 ASCII 时,它给了我胡言乱语。我相信还有其他与该数据库一起使用的文件被编码为 Unicode UTF-16。所以我想尝试将这个十六进制字符串转换为 UTF-16,看看它是什么样子的。

有人可以帮我弄清楚如何在 Powershell 中执行此操作吗?

谢谢

【问题讨论】:

  • 你为什么认为它是 UTF-16?它的高字节中有很多零吗?在此处显示一些示例
  • 如何将它作为字节数组保存到文件中,然后以编码 unicode 的形式打开文件?字符串是什么样子的?
  • phuclv,我认为它反映的文本是 utf-16 的事实。我认为它正在编码 texx 文件的一部分,即 utf-16。

标签: powershell unicode hex utf-16


【解决方案1】:

假设您的字符串由偶数个十六进制字符组成,您可以在每 2 个字符后插入一个分隔符,删除尾随分隔符(以不生成尾随空元素),然后在分隔符处拆分字符串。

$s = 'a3422b4a'
$s -replace '..', '$&:' -replace ':$' -split ':'

然后将生成的片段转换为字节:

... | ForEach-Object { [byte]"0x$_" }

收集变量中的字节数组并将其转换为Unicode字符串:

[Text.Encoding]::Unicode.GetString($bytes)

[Text.Encoding]::Unicode 是 UTF-16 LE。如果您需要 UTF-16 BE,请使用 [Text.Encoding]::BigEndianUnicode


编辑:再想一想,您甚至不需要循环进行转换。您可以在每对十六进制字符之前插入0x,然后将字符串拆分为字符后跟序列0x,然后将结果数组转换为字节数组。

[byte[]]($s -replace '..', '0x$&' -split '(?<=.)(?=0x)')

【讨论】:

  • 谢谢,我会试一试,如果成功了再告诉你!
  • 嗯,我用你第一次提到的很长的路要工作。但我的输出都是随机的亚洲字符。所以这可能是不对的。你的方法可能很好,它可能只是没有像我想象的那样编码。我实际上拥有的是“0x”,后跟一个长的十六进制字符串。在最短的情况下,它大约有 400 个字符长,但每个字符都不同。知道这可能代表什么吗?
  • @ARZ2019 不,您需要为此提供更多信息。请edit您的问题并提供a)示例数据,b)您用于处理数据的代码,以及c)代码产生的输出。
猜你喜欢
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 2010-11-16
  • 2018-08-21
  • 2018-01-22
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多