我有一个字符串,通过使用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表中遇到字符时,它都被遗忘了。
任何人都可以帮我理解解决此问题的方法吗?正如我之前所说,我阅读了其他相关主题,但对于解决这个问题的最佳方法仍然感到困惑。
答案 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文本的问题。