機能の実現:
拡張カーネルライブラリ関数
- tonumberEx(__)=数値に変換(拡張バージョン)\ nパラメーターが10進数の場合、小数点以下9桁に丸められた値を返します; \ ntonumber()を置き換えることができます
- toHex(__)= 16進テキストを取得します。\ n数値、テキスト文字列、バッファ、ポインタをサポートします。\ n文字列、バッファ、ポンターの場合、パラメータを取ることができます:\ n @ 2:開始位置を指定します(負の数にすることができます)\ n @ 3:変換するデータの長さを指定します。
- hexToNumber(__)= 16進数のテキストから数値
- hexToString(__)= 16進数のテキストからテキストへ
- hexToBuffer(__)=バッファリングする16進テキスト
- string.utf8ToAnsi(__)= utf8からansi。コードは_CHARSET_で始まる定数です。
- string.utf8ToGbk(__)= utf8からGBK。コードは_CHARSET_で始まる定数です。
- string.utf8ToUnicode(__)= utf8からunicode(UTF16)。コードは_CHARSET_で始まる定数です。
- string.ansiToUtf8(__)= ansiからutf8。コードは_CHARSET_で始まる定数です。
- string.ansiToUnicode(__)= ansi to unicode(UTF16)。コードは_CHARSET_で始まる定数です。
- string.ansiToGbk(__)= ansiからgbk。コードは_CHARSET_で始まる定数です。
- string.unicodeToUtf8(__)= unicode(UTF16)からutf8。コードは_CHARSET_で始まる定数です。
- string.unicodeToAnsi(__)= unicode(UTF16)からansiへ。コードは_CHARSET_で始まる定数です。
- string.unicodeToGbk(__)= unicode(UTF16)からgbk。コードは_CHARSET_で始まる定数です。
- table.sortEx(__、1、false、0)=テーブルの並べ替え。\ n元のテーブルを直接変更し、変更が成功した場合はtrueを返します。\ nパラメータ1:並べ替えるテーブル。各アイテムがテーブル(サブテーブル)の場合、パラメーター2で並べ替えるための参照フィールドを指定する必要があります; \ nパラメーター2:並べ替えるサブテーブルの参照フィールド(配列インデックスまたは辞書キー名); \ nサブアイテムの場合配列の場合、参照フィールドのデフォルトは1です。\ nパラメータ3:順序を逆にするかどうか。\ nパラメータ4:並べ替え前にデータを変換し、1を時間に変換し、2を数値に変換し、3をテキストに変換し、その他は変換しません。
- _CHARSET_UTF8 = @ 65001 / * _ CHARSET_UTF8 * /
- _CHARSET_UTF16 = @ 1200 / * _ CHARSET_UTF16 * /
- _CHARSET_UNICODE = @ 1200 / * _ CHARSET_UNICODE * /
- _CHARSET_BIG5 = @ 950 / * _ CHARSET_BIG5 * /
- _CHARSET_GBK = @ 936 / * _ CHARSET_GBK * /
- _CHARSET_ANSI = @ 0x0 / * _ CHARSET_ANSI * /
- _CHARSET_GB18030 = @ 54936 / * _ CHARSET_GB18030 * /
- _CHARSET_GB2312 = @ 936 / * _ CHARSET_GB2312 * /
ライブラリファイルの場所:
〜\ lib \ godking.aardio
ライブラリコード:
namespace godking
..tonumberEx = function(num,...){
if (type(num)=="number"){
if (..math.isInteger(num))
return num;
return ..math.round(num,9);
} return ..tonumber(num,...);
}
..toHex = function(v,s,l){
select(type(v)) {
case "number" {
return ..string.format("%X",v);
}
case "string","buffer" {
if (s?l) return ..toHex(..raw.toPointer(v),s,l);
else return ..string.hex(v,"");
}
case "pointer" {
s:=1
l:=1
var b = ..raw.buffer(l)
..raw.copy(b,..topointer((..tonumber(v)+s-1)),l)
return ..string.hex(b,"");
}
}
}
..string.utf8ToAnsi = function(str){
return ..string.fromto(str,65001/*_CHARSET_UTF8*/,0x0/*_CHARSET_ANSI*/);
}
..string.utf8ToGbk = function(str){
return ..string.fromto(str,65001/*_CHARSET_UTF8*/,936/*_CHARSET_GBK*/);
}
..string.utf8ToUnicode = function(str){
return ..string.fromto(str,65001/*_CHARSET_UTF8*/,1200/*_CHARSET_UNICODE*/);
}
..string.ansiToUtf8 = function(str){
return ..string.fromto(str,0x0/*_CHARSET_ANSI*/,65001/*_CHARSET_UTF8*/);
}
..string.ansiToUnicode = function(str){
return ..string.fromto(str,0x0/*_CHARSET_ANSI*/,1200/*_CHARSET_UNICODE*/);
}
..string.ansiToGbk = function(str){
return ..string.fromto(str,0x0/*_CHARSET_ANSI*/,936/*_CHARSET_GBK*/);
}
..string.unicodeToUtf8 = function(str){
return ..string.fromto(str,1200/*_CHARSET_UNICODE*/,65001/*_CHARSET_UTF8*/);
}
..string.unicodeToAnsi = function(str){
return ..string.fromto(str,1200/*_CHARSET_UNICODE*/,0x0/*_CHARSET_ANSI*/);
}
..string.unicodeToGbk = function(str){
return ..string.fromto(str,1200/*_CHARSET_UNICODE*/,936/*_CHARSET_GBK*/);
}
..hexToNumber = function(hex){
return ..tonumber(hex,16);
}
..hexToString = function(hex){
return ..string.unhex(hex,"");
}
..hexToBuffer = function(hex){
return ..raw.buffer(..string.unhex(hex,""));
}
..table.sortEx = function(array,key,desc=false,convert=0){
if (!array) return ;
if (type(array)!="table") return ;
if (..table.count(array)=0) return ;
//对数组进行排序
if (type(array[1])!="table"){
//如果没有数组成员则返回
if(!#array) return ;
if (convert=1/*转换为时间*/){
if(desc){
..table.sort(array,function(b){
return ..time(owner) > ..time(b)
})
}else{
..table.sort(array,function(b){
return ..time(owner) < ..time(b)
})
}
}elseif (convert=2/*转换为数值*/){
if(desc){
..table.sort(array,function(b){
return ..tonumber(owner) > ..tonumber(b)
})
}else{
..table.sort(array,function(b){
return ..tonumber(owner) < ..tonumber(b)
})
}
}elseif (convert=3/*转换为文本*/){
if(desc){
..table.sort(array,function(b){
return ..tostring(owner) > ..tostring(b)
})
}else{
..table.sort(array,function(b){
return ..tostring(owner) < ..tostring(b)
})
}
}else/*不进行转换处理*/{
if(desc){
..table.sort(array,function(b){
return owner > b
})
}else{
..table.sort(array,function(b){
return owner < b
})
}
}
return true;
}
//处理子表合法性
if (#array[1]){
key:=1
if (type(key)!="number") return ;
}else{
key:=..table.keys(array[1])[1]
if (!key or type(key)!="string") return ;
}
//进行子表排序
if(convert=1/*转换为时间*/){
if(desc){
..table.sort(array,function(b){
return ..time(owner[key]) > ..time(b[key])
})
}
else {
..table.sort(array,function(b){
return ..time(owner[key]) < ..time(b[key])
})
}
}elseif(convert=2/*转换为数值*/){
if(desc){
..table.sort(array,function(b){
return ..tonumber(owner[key]) > ..tonumber(b[key])
})
}
else {
..table.sort(array,function(b){
return ..tonumber(owner[key]) < ..tonumber(b[key])
})
}
}elseif(convert=3/*转换为文本*/){
if(desc){
..table.sort(array,function(b){
return ..tostring(owner[key]) > ..tostring(b[key])
})
}
else {
..table.sort(array,function(b){
return ..tostring(owner[key]) < ..tostring(b[key])
})
}
}else/*不进行转换处理*/{
if(desc){
..table.sort(array,function(b){
return owner[key] > b[key]
})
}
else {
..table.sort(array,function(b){
return owner[key] < b[key]
})
}
}
return true;
}
/**intellisense()
tonumberEx(__) = 转换为数值(加强版)\n参数如果为小数,返回四舍五入到小数点后9位的数值;\n可代替tonumber()
toHex(__) = 取十六进制文本。\n支持数值number、文本string、缓冲区buffer、指针pointer。\n如果是string、buffer、ponter,可以带参数:\n @2:指定开始位置(可以为负数)\n @3:指定要转换的数据长度。
hexToNumber(__) = 十六进制文本转数值
hexToString(__) = 十六进制文本转文本
hexToBuffer(__) = 十六进制文本转缓冲区
end intellisense**/
/**intellisense()
string.utf8ToAnsi(__) = utf8转ansi。编码为_CHARSET_开头的常量。
string.utf8ToGbk(__) = utf8转GBK。编码为_CHARSET_开头的常量。
string.utf8ToUnicode(__) = utf8转unicode(UTF16)。编码为_CHARSET_开头的常量。
string.ansiToUtf8(__) = ansi转utf8。编码为_CHARSET_开头的常量。
string.ansiToUnicode(__) = ansi转unicode(UTF16)。编码为_CHARSET_开头的常量。
string.ansiToGbk(__) = ansi转gbk。编码为_CHARSET_开头的常量。
string.unicodeToUtf8(__) = unicode(UTF16)转utf8。编码为_CHARSET_开头的常量。
string.unicodeToAnsi(__) = unicode(UTF16)转ansi。编码为_CHARSET_开头的常量。
string.unicodeToGbk(__) = unicode(UTF16)转gbk。编码为_CHARSET_开头的常量。
table.sortEx(__,1,false,0) = 表排序。\n直接修改原表,修改成功返回true。\n参数1:要排序的表。如果每一项都是表(子表),则需要通过参数2指定排序的参考字段;\n参数2:要排序的子表的参考字段(数组索引或字典键名);\n 如果子项为数组,则参考字段默认为1\n参数3:是否逆序。\n参数4:将数据进行转换后再排序,1转换为时间,2转换为数值,3转换为文本,其它不转换。
end intellisense**/
/**intellisense()
_CHARSET_UTF8 = @65001/*_CHARSET_UTF8*/
_CHARSET_UTF16 = @1200/*_CHARSET_UTF16*/
_CHARSET_UNICODE = @1200/*_CHARSET_UNICODE*/
_CHARSET_BIG5 = @950/*_CHARSET_BIG5*/
_CHARSET_GBK = @936/*_CHARSET_GBK*/
_CHARSET_ANSI = @0x0/*_CHARSET_ANSI*/
_CHARSET_GB18030 = @54936/*_CHARSET_GB18030*/
_CHARSET_GB2312 = @936/*_CHARSET_GB2312*/
end intellisense**/
呼び出し例:
import console;
import godking;
var d1 = 0.575*100
var d2 = tonumberEx(0.575*100)
console.log("未处理的不精确值 ->",string.format("%.16f",d1 ))
console.log("处理过的精确值 ->",string.format("%.16f",d2 ))
var num = 12345678
var txt="12345678"
var buffer = raw.buffer(txt);
var pointer = raw.toPointer(buffer)
console.log(toHex(num))
console.log(toHex(txt))
console.log(toHex(buffer))
console.log(toHex(pointer,-8,20))
var utf8 = "这里是utf8字符串"
var ansi = string.utf8ToAnsi(utf8)
var unicode = string.ansiToUnicode(ansi)
console.log("utf8->",toHex(utf8))
console.log("ansi->",toHex(ansi))
console.log("unicode->",toHex(unicode))
console.pause(true);