【问题标题】:ASCII Representation of Hexadecimal十六进制的 ASCII 表示
【发布时间】:2016-03-05 15:25:25
【问题描述】:

我有一个字符串,通过使用string.format("%02X", char),我收到了以下内容:

74657874000000EDD37001000300

最后,我希望该字符串如下所示:

t e x t NUL NUL NUL í Ó p SOH NUL ETX NUL(空格只是为了说明示例中所需的字符)。

我尝试使用\x..(hex#)string.char(0x..(hex#))(其中(hex#) 是我想要的字符的字母数字表示)但我仍然无法获得我正在寻找的结果。在阅读了有关此主题的另一个线程:what is the way to represent a unichar in lua 和答案中提供的链接后,我并没有完全理解在我的最终代码中我需要做什么才能使其正常工作。

我正在寻求一些帮助,以更好地理解一种方法,以帮助我实现下面提供的预期结果。

预计到达时间:

好吧,我以为我已经用以下代码修复了它:

function hexToAscii(input)
    local convString = ""
    for char in input:gmatch("(..)") do
        convString = convString..(string.char("0x"..char))
    end
    return convString
end

它似乎有效,但没有考虑127以上的字符。菜鸟错误。现在我不确定如何让最多 256 个附加字符显示它们的 ASCII 值。

我做了以下检查,因为我无法在文件中真正“看到”它们。

function asciiSub(input)
    input = input:gsub(string.char(0x00), "<NUL>")  -- suggested by a coworker
    print(input)
end

我做了几个gsub 字符串来替换其他字符,我的文件返回替换字符串。但是当我在扩展的 ASCII 表中遇到字符时,它就被遗忘了。

谁能帮助我了解解决此问题的方法或新方法?正如我之前所说,我阅读了有关此问题的其他主题,但仍然对解决此问题的最佳方法感到困惑。

【问题讨论】:

  • 最多 256 个附加字符 → 比 Unicode 更多。 %X 是将数字打印为十六进制的格式。确实,您的字符串中的字节似乎被一个一个地打印为十六进制数字,例如 t74
  • @roeland 你是对的,因为我的代码将打印出最多 127 个 ASCII 字符。但除此之外,它让我没有任何表示。例如,如果我想要十进制的 234 (或 0xEA ),我没有收到我希望收到的“欧米茄”。相反,它只是空的。
  • 您还必须确保您的输出终端界面(例如字体)可以处理您希望显示的字形。
  • 不清楚您要做什么或这与 Unicode 有什么关系。您似乎有一个十六进制数字的字符串,并且您希望将每 2 个十六进制数字转换为一个字节。这不是 Unicode 感知转换。那么 Unicode 适合在哪里呢?
  • 没有一个“扩展ASCII表”,除非这个词很漂亮。

标签: lua hex type-conversion ascii


【解决方案1】:

转换base16编码字符串的简单方法就是

function unhex( input )
    return (input:gsub( "..", function(c)
        return string.char( tonumber( c, 16 ) )
    end))
end

这基本上就是你所拥有的,只是更干净一点。 (没有必要说"(..)"".." 就足够了——如果你不指定捕获,你会自动得到整个匹配。虽然如果你写string.char( "0x"..c ) 它可能有效,但它只是邪恶的——你连接很多字符串,然后触发自动转换为数字。在显式转换时只指定基数会更好。)

无论编码如何,生成的字符串都应该正是进入十六进制转储程序的内容。

如果您无法正确显示结果,您的查看器也将无法显示原始输入。如果您对原始输入和结果输出使用不同的查看器(例如文本编辑器和终端),请尝试将输出写入文件并使用与原始输入相同的查看器查看它,那么两者应该完全一样。

让采用不同编码(例如“旧”8 位代码页之一或众多 Unicode 版本之一)的查看器显示相同的内容需要在不同格式之间进行转换,这往往相当复杂或甚至不可能。由于您没有提到涉及哪些编码(也没有提到任何其他信息,如操作系统或使用的程序可能暗示可能的编码),所以这几乎可以是任何东西,因此不可能对此进行更具体的说明。

【讨论】:

  • 很好的信息!你给了我一个想法,我将暂时打印出我想要的每个字符的十六进制表示(只是字母数字代码),直到我知道文件是“正确的”。我将比较文件(从站接受的文件的副本)和我试图模拟的文件,以便将结果与十六进制编辑器进行比较。另一个愚蠢的菜鸟问题:虽然我的主人/主机无法填充我理想地希望在视觉上看到的确切结果,但仍会接收和读取完整的输出吗?前任。 0xA5 -或- \xA5
  • @Pwrcdr87:will the full output still be received and read? 是的。 Lua 字符串也兼作 Lua 处理任意字节数据的方式。
【解决方案2】:

你实际上有几个问题:

  • 首先,确保您知道术语字符编码的含义,并且您知道 charactersbytes 之间的区别。关于该主题的热门帖子是The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

  • 那么,您刚刚收到的字节使用了什么编码?你需要知道这一点,否则你不知道字节 234 是什么意思。例如它可能是 ISO-8859-1,在这种情况下它是 U+00EA,即字符 ê

  • 字符 0 到 31 是控制字符(例如,0 是 NUL)。为这些使用查找表。

  • 然后,在终端上显示字符是困难的部分。在终端上显示 ê 没有独立于平台的方式。使用标准的print 函数可能是不可能的。如果您无法弄清楚这一步,您可以搜索一个专门处理如何从 Lua 中打印 Unicode 文本的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-09
    • 2015-08-23
    • 2012-10-02
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    相关资源
    最近更新 更多