通用库中有什么字符串函数呢?

通用库中有什么字符串函数呢?,第1张

这个库提供了字符串处理的通用函数。

1例如字符串查找、子串、模式匹配等。 当在 Lua 中对字符做索引时,第一个字符从 1 开始计算(而不是 C 里的 0 )。 索引可以是负数,它指从字符串末尾反向解析。 即,最后一个字符在 -1 位置处,等等。
2字符串库中的所有函数都在表 string 中。 它还将其设置为字符串元表的 __index 域。 因此,你可以以面向对象的形式使用字符串函数。 例如,stringbyte(s,i) 可以写成 s:byte(i)。
字符串库假定采用单字节字符编码。
stringbyte (s [, i [, j]])
返回字符 s[i], s[i+1],,s[j] 的内部数字编码。 i 的默认值是 1 ; j 的默认值是 i。 这些索引以函数 stringsub 的规则修正。
数字编码没有必要跨平台。
stringchar (···)
接收零或更多的整数。 返回和参数数量相同长度的字符串。 其中每个字符的内部编码值等于对应的参数值。
数字编码没有必要跨平台。
stringdump (function [, strip])
3返回包含有以二进制方式表示的(一个 二进制代码块 )指定函数的字符串。 之后可以用 load 调用这个字符串获得 该函数的副本(但是绑定新的上值)。 如果 strip 为真值, 二进制代码块不携带该函数的调试信息 (局部变量名,行号,等等。)。
带上值的函数只保存上值的数目。 当(再次)加载时,这些上值被更新为 nil 的实例。 (你可以使用调试库按你需要的方式来序列化上值,并重载到函数中)
stringfind (s, pattern [, init [, plain]])
4查找第一个字符串 s 中匹配到的 pattern )。 如果找到一个匹配,find 会返回 s 中关于它起始及终点位置的索引; 否则,返回 nil。 第三个可选数字参数 init 指明从哪里开始搜索; 默认值为 1 ,同时可以是负值。 第四个可选参数 plain 为 true 时, 关闭模式匹配机制。 此时函数仅做直接的 “查找子串”的 *** 作, 而 pattern 中没有字符被看作魔法字符。 注意,如果给定了 plain ,就必须写上 init 。
如果在模式中定义了捕获,捕获到的若干值也会在两个索引之后返回。
stringformat (formatstring, ···)
5返回不定数量参数的格式化版本, 格式化串为第一个参数(必须是一个字符串)。 格式化字符串遵循 ISO C 函数 sprintf 的规则。 不同点在于选项 , h, L, l, n, p 不支持, 另外还增加了一个选项 q。 q 选项将一个字符串格式化为两个双引号括起,对内部字符做恰当的转义处理的字符串。 该字符串可以安全的被 Lua 解释器读回来。

最近在写 Lua 脚本,需要读取二进制文件并转化为十六进制的字符串,C语言读文件,返回的是字符串类型,Lua 返回的也是字符串类型(用的时候忘记去查类型了,导致这个地方浪费了很长的时间。。。),由于找解决方法找了蛮长时间的,所有在这里先记录一下。

local function readAll(filePath)

--

local f = assert(ioopen(filePath, "rb"))

local content = f:read("all")

f:close()

return content

end

local function bytesToHexStr(filePath)

--

local content = readAll(filePath)

local result = ""

local len = stringlen(content)

for i = 1, len do

local charcode = tonumber(stringbyte(content, i, i));

local hexstr = stringformat("%02X", charcode);

result = result hexstr

end

return result

end

有一个小问题,顺便记录一下,在读取了二进制文件后,本想用print打印看看内容有没有被读出来,结果只打印了一部分,用 notepad++ 打开发现,文件有很多 NUL 的字符,原因是 print 在遇到 NUL 就结束打印了,囧o(╯□╰)o

十六进制转二进制可以参考这个: Lua小程序:十六进制字符串和二进制数据间的转换

可以利用字符替换得到
-- 将“0”替换成“0”
s1, c = stringgsub(a, "0", "0")
s1 = 替换后的字符,因为 0 替换 0,所以和 a 没区别
c = 一共替换了多少个字符,这个就是你要的结果
_, c = stringgsub(a, "0", "")
c = 13

function Ecrypt(Text)
   return Text:gsub('', function (c) return stringformat ("%02X", (stringbyte(c) + 13) % 256) end):gsub(" ", "+")
end
function decrypt(code)
   return code:gsub('', function(h)
        return stringchar((tonumber(h,16)+256-13)%256)
   end)
end
c=Ecrypt("hello")
print(decrypt(c))hello   5

两者在c语言中表示字节有细微区别。
byte表示0-255
sbyte表示-128~127
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言最初的标准。

print("2"<"15")
print(stringbyte("2"))
print(stringbyte("15"))
print(stringbyte("1"))
print(stringbyte("5"))
print(tonumber("2")<tonumber("15"))

Convert byte[] to hex string这里我们可以将byte转换成int,然后利用IntegertoHexString(int)来转换成16进制字符串。
@param src byte[] data
@return hex string
/
public static String bytesToHexString(byte[] src){
StringBuilder stringBuilder = new StringBuilder("");
if (src == null || srclength <= 0) {
return null;
}
for (int i = 0; i < srclength; i++) {
int v = src[i] & 0xFF;
String hv = IntegertoHexString(v);
if (hvlength() < 2) {
stringBuilderappend(0);
}
stringBuilderappend(hv);
}
return stringBuildertoString();
}
/
Convert hex string to byte[]
@param hexString the hex string
@return byte[]
/
public static byte[] hexStringToBytes(String hexString) {
if (hexString == null || hexStringequals("")) {
return null;
}
hexString = hexStringtoUpperCase();
int length = hexStringlength() / 2;
char[] hexChars = hexStringtoCharArray();
byte[] d = new byte[length];
for (int i = 0; i < length; i++) {
int pos = i 2;
d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
}
return d;
}
/
Convert char to byte
@param c char
@return byte
/
private byte charToByte(char c) {
return (byte) "0123456789ABCDEF"indexOf(c);
}

这是汉字编码表示
你可以用一个程序来转换
你把下面的代码保存为 bianmalua
然后运行:
lua bianmalua 砍树
就能显示 砍树 的编码: \191\179\202\247
local str = arg[1];
local encode = "";
for i=1,#str do
local c = stringbyte(str, i);
encode = encode "\\" stringformat("%d",c);
end
print(encode);


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13390753.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-27
下一篇 2023-07-27

发表评论

登录后才能评论

评论列表(0条)

保存