十六进制的ASCII表示形式

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

74657874000000EDD37001000300

最终,我希望该字符串看起来像下面的内容:

“t e x t NUL NUL NUL í Ó p SOH NUL ETX NUL”(空格仅用于说明所需的字符)。

我已经尝试使用\x..(十六进制#)string.char(0x ..(十六进制#))(其中(十六进制#)是所需字符的字母数字表示形式) ,我仍然无法获得我正在寻找的结果。阅读有关此主题的另一个线程之后:[what is the way to represent a unichar in lua](https://stackoverflow.com/questions/7780179/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表中的字符时,它被全部遗忘了。

有谁可以帮助我了解此问题的解决方法或新方法?正如我之前所述,我已经阅读了有关此问题的其他主题,并对这个问题的最佳方法仍然感到困惑。

点赞
用户4447998
用户4447998

你实际上有几个问题:

  • 首先,确保你知道字符编码的含义,并且知道“字符”和“字节”的区别。有一篇关于此主题的热门文章是软件开发人员绝对必须知道的有关Unicode和字符集(没有任何借口)的绝对最低要求!

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

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

  • 然后,在终端上显示字符是困难的部分。没有平台无关的方式在终端上显示ê。使用标准的“print”函数可能会很难。如果你找不出这一步,你可以搜索一个专门处理如何从Lua中打印Unicode文本的问题。

2015-12-02 01:58:56
用户805875
用户805875

将一个 base16 编码的字符串转换成普通字符串的简单方法就是:

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

这基本上就是你需要的,只是更加简洁。 没有必要写 "(..)"".."就可以了,如果不指定捕获,你会自动得到整个匹配。虽然如果你写 string.char( "0x"..c ),程序也会正常运行,但是这样做很危险——你会拼接大量字符串并触发自动转换为数字。最好是在显式转换时直接指定基数。

结果字符串应该与进入十六进制转储器的内容完全相同,无论编码方式如何。

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

使用假定不同编码方式(例如“旧”的8位代码页或Unicode的许多版本之一)的查看器显示相同内容需要在不同格式之间进行转换,这往往是相当复杂甚至不可能的。由于您没有提到涉及哪些编码方式(也没有提供任何有关操作系统或使用的程序的其他信息,这些信息可能提示可能的编码方式),因此可能是任何情况,因此无法再提供更具体的建议。

2015-12-02 02:16:27