十六进制的 ASCII 表示
ASCII Representation of Hexadecimal
我有一个字符串,通过使用 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 和答案中提供的链接后,我没有完全理解我需要在我的最终代码中做些什么,即 acceptable 才能正常工作。
我正在寻求一些帮助,以更好地理解一种可以帮助我实现下面提供的预期结果的方法。
预计到达时间:
好吧,我认为我已经用下面的代码修复了它:
function hexToAscii(input)
local convString = ""
for char in input:gmatch("(..)") do
convString = convString..(string.char("0x"..char))
end
return convString
end
貌似可以,但是没想过127以上的字符。菜鸟错误。现在我不确定如何让最多 256 个字符显示它们的 ASCII 值。
我做了以下检查,因为我无法在文件中真正"see"它们。
function asciiSub(input)
input = input:gsub(string.char(0x00), "<NUL>") -- suggested by a coworker
print(input)
end
我做了几个 gsub
字符串来替换其他字符,我的文件返回了替换字符串。但是当我 运行 转换为扩展 ASCII table 中的字符时,它就被遗忘了。
任何人都可以帮助我了解解决此问题的方法或新方法吗?正如我之前所说,我阅读了关于此的其他主题,但仍然对解决此问题的最佳方法感到困惑。
你实际上有几个问题:
首先,确保您知道术语字符编码的含义,并且您知道字符和字节。关于该主题的热门 post 是 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
)。对这些使用查找 table。
然后,在终端上显示字符是最难的部分。没有独立于平台的方式在终端上显示 ê。使用标准 print
函数很可能是不可能的。如果您无法解决此步骤,您可以搜索专门处理如何从 Lua.
print Unicode 文本的问题
转换 base16 编码字符串的简单方法就是
function unhex( input )
return (input:gsub( "..", function(c)
return string.char( tonumber( c, 16 ) )
end))
end
这基本上就是您所拥有的,只是更干净一些。 (没有必要说 "(..)"
,".."
就足够了——如果你没有指定捕获,你会自动得到整个匹配。虽然如果你写 string.char( "0x"..c )
它可能会起作用,但它只是邪恶——你连接了很多字符串,然后触发自动转换为数字。在显式转换时只指定基数更好。)
无论编码如何,生成的字符串都应该与十六进制转储器中的内容完全相同。
如果您无法正确显示结果,您的查看器也将无法显示原始输入。如果您对原始输入和结果输出使用不同的查看器(例如文本编辑器和终端),请尝试将输出写入文件并使用与原始输入相同的查看器查看它,那么两者应该一模一样
让采用不同编码(例如 "old" 8 位代码页之一或许多 Unicode 版本之一)的观众显示同一内容将需要不同格式之间的转换,这往往相当复杂,甚至不可能。由于您没有提到涉及什么编码(也没有提到任何其他信息,如 OS 或使用的程序可能暗示可能的编码),这可能只是任何事情,所以不可能说更具体的事情。
我有一个字符串,通过使用 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 和答案中提供的链接后,我没有完全理解我需要在我的最终代码中做些什么,即 acceptable 才能正常工作。
我正在寻求一些帮助,以更好地理解一种可以帮助我实现下面提供的预期结果的方法。
预计到达时间:
好吧,我认为我已经用下面的代码修复了它:
function hexToAscii(input)
local convString = ""
for char in input:gmatch("(..)") do
convString = convString..(string.char("0x"..char))
end
return convString
end
貌似可以,但是没想过127以上的字符。菜鸟错误。现在我不确定如何让最多 256 个字符显示它们的 ASCII 值。
我做了以下检查,因为我无法在文件中真正"see"它们。
function asciiSub(input)
input = input:gsub(string.char(0x00), "<NUL>") -- suggested by a coworker
print(input)
end
我做了几个 gsub
字符串来替换其他字符,我的文件返回了替换字符串。但是当我 运行 转换为扩展 ASCII table 中的字符时,它就被遗忘了。
任何人都可以帮助我了解解决此问题的方法或新方法吗?正如我之前所说,我阅读了关于此的其他主题,但仍然对解决此问题的最佳方法感到困惑。
你实际上有几个问题:
首先,确保您知道术语字符编码的含义,并且您知道字符和字节。关于该主题的热门 post 是 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
)。对这些使用查找 table。然后,在终端上显示字符是最难的部分。没有独立于平台的方式在终端上显示 ê。使用标准
print
函数很可能是不可能的。如果您无法解决此步骤,您可以搜索专门处理如何从 Lua. print Unicode 文本的问题
转换 base16 编码字符串的简单方法就是
function unhex( input )
return (input:gsub( "..", function(c)
return string.char( tonumber( c, 16 ) )
end))
end
这基本上就是您所拥有的,只是更干净一些。 (没有必要说 "(..)"
,".."
就足够了——如果你没有指定捕获,你会自动得到整个匹配。虽然如果你写 string.char( "0x"..c )
它可能会起作用,但它只是邪恶——你连接了很多字符串,然后触发自动转换为数字。在显式转换时只指定基数更好。)
无论编码如何,生成的字符串都应该与十六进制转储器中的内容完全相同。
如果您无法正确显示结果,您的查看器也将无法显示原始输入。如果您对原始输入和结果输出使用不同的查看器(例如文本编辑器和终端),请尝试将输出写入文件并使用与原始输入相同的查看器查看它,那么两者应该一模一样
让采用不同编码(例如 "old" 8 位代码页之一或许多 Unicode 版本之一)的观众显示同一内容将需要不同格式之间的转换,这往往相当复杂,甚至不可能。由于您没有提到涉及什么编码(也没有提到任何其他信息,如 OS 或使用的程序可能暗示可能的编码),这可能只是任何事情,所以不可能说更具体的事情。