十六进制的ASCII表示

时间:2015-12-01 16:16:41

标签: lua hex type-conversion ascii

我有一个字符串,通过使用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以及答案中提供的链接之后,我并没有完全理解我需要在最终代码中做些什么才能使其工作。

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

ETA:

我认为我已使用以下代码修复了它:

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表中遇到字符时,它都被遗忘了。

任何人都可以帮我理解解决此问题的方法吗?正如我之前所说,我阅读了其他相关主题,但对于解决这个问题的最佳方法仍然感到困惑。

2 个答案:

答案 0 :(得分:3)

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

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

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

无论编码如何,结果字符串都应该是进入hex-dumper的字符串。

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

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

答案 1 :(得分:0)

你实际上有几个问题:

  • 首先,确保您知道术语字符编码的含义,并且您知道字符字节之间的区别。关于该主题的热门帖子是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文本的问题。