【Lua语言】如何将十六进制负数转成十进制

最近在项目中遇到一个很不起眼但没办法绕过的问题,查了很多资料,发现基本没什么人遇到过这个问题,于是写下这篇文章,做下记录,也可以帮助后面遇到该问题的小伙伴,提高学习和工作的效率。

准备工作

在计算机中,16进制的负数是以补码的形式存在的。所谓补码,就是在原码的基础上,按位取反,处理后的数据再加1,此时负数就可以直接去掉了。
比如:-3(H)=0xFD
用二进制表示:-000000011----11111101

安装开发环境

此处略过,大概流程为安装Vscode,安装便于开发的插件和Code Runner,下载Lua开发环境包,设置环境变量。

查看Lua的版本

Vscode命令行或者cmd命令窗口下输入:lua -v

lua中文转16进制 lua转换10进制_Lua

Lua语言:按位操作

在进行位操作的时候,Lua语言会因为版本不同而报错
下面就介绍下几个版本的Lua语言是如何进行位操作的吧

Lua 5.1版本

Lua 5.1版本使用一个外部的bitlib库,提供几个位操作函数

--引入bit库
require "bit"
-- and操作
bit.band(a,b)
-- or操作
bit.bor(a,b)
-- xor操作
bit.bxor(a,b)
-- not操作
bit.bnot(a,b)
--左移n位
bit.lshift(a,n)
-- 右移n位
bit.rshift(a,n)
Lua 5.2版本

Lua 5.2版本提供了一个内置库bit32,同样以函数的形式提供位操作引入内置bit32库

require "bit32"
-- and操作
bit32.band(a,b)
-- or操作
bit32.bor(a,b)
-- xor操作
bit32.bxor(a,b)
-- not操作
bit32.bnot(ab)
--左移n位
bit32.lshift(a,n)
--右移n位
bit32.rshift(a,n)
Lua 5.3版本

自Lua 5.3版本后,Lua可以像C语言一样提供内置的操作符,实现按位操作。

-- and操作	
a & b
--or操作	
a | b
-- xor操作
a ~ b
-- not操作
~a
--左移n位
a << n
--右移n位
a >> n

场景复现

写好代码就可以按左上角的code runner或者快捷键ctrl+alt+n

lua中文转16进制 lua转换10进制_lua_02


lua中文转16进制 lua转换10进制_开发语言_03


lua中文转16进制 lua转换10进制_Lua_04

可以看到,5.3.5版本的Lua支持内置操作符 ~ 异或操作,而5.1.5只能通过加载模块、调用函数的形式来实现异或操作。之前遇到的坑就是因为自己的环境是5.1.5版本,而最新的教程都是关于5.3.5及其以后的版本的操作,一直报错却找不到原因,真的很酸爽🙄

另外,目前官方已经不发布5.3.5的版本,只有5.3.6,目前本人必须要5.3.5的Lua环境,因为版本的问题踩了太多坑,怕了。无奈只能用5.3.6的版本,希望问题不大~

下面就上链接,需要5.3.1以及5.3.6的Lua版本的同学可以自行下载

链接:https://pan.baidu.com/s/1Y-s9Eag0hHgvITGKxK8IOA
提取码:0000

后面两个文件夹是可以直接用的,环境变量设置一下就行

前面两个是我用来切换版本的文件,设置好环境变量直接把备份的文件丢到bin目录里替换就可以了

lua中文转16进制 lua转换10进制_lua中文转16进制_05

总结

Lua 5.1、Lua 5.2版本对于位的操作都是需要加载模块,前者加载“bit”,后者加载"bit32",从Lua5.3.5开始,就可以使用最新教程按位操作。

有时候遇到问题的时候不仅要考虑自己的语法是否错误,比如中英文标点问题、括号是否成对匹配等,还要考虑开发环境的版本是否合适。