Bläddra i källkod

feat: 添加 char.HexToBin 和 char.BinToHex 两个 API

dzp 1 år sedan
förälder
incheckning
7c66acf660
1 ändrade filer med 149 tillägg och 0 borttagningar
  1. 149 0
      plugins/lib/xtintin/string.tin

+ 149 - 0
plugins/lib/xtintin/string.tin

@@ -125,6 +125,155 @@ PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 
 #func {str.DecToHex}    {#format result {00%X} {%0}; #format result {%.-2s} {$result}};
 #func {dec2hex}         {#return {@str.DecToHex{%0}}};
 
+///=== {
+// #@ str.BinToHex <二进制数字串>
+//    二进制转十六进制
+//
+//  EXAMPLE: \@str.BinToHex{0}
+//  RESULT:  {0}
+//
+//  EXAMPLE: \@str.BinToHex{1}
+//  RESULT:  {1}
+//
+//  EXAMPLE: \@str.BinToHex{10}
+//  RESULT:  {2}
+//
+//  EXAMPLE: \@str.BinToHex{0111}
+//  RESULT:  {7}
+//
+//  EXAMPLE: \@str.BinToHex{1000}
+//  RESULT:  {8}
+//
+//  EXAMPLE: \@str.BinToHex{1111}
+//  RESULT:  {F}
+//
+//  EXAMPLE: \@str.BinToHex{01011}
+//  RESULT:  {0B}
+//
+//  EXAMPLE: \@str.BinToHex{0000010010001101001010101111001101}
+//  RESULT:  {01234ABCD}
+// };
+#func {str.BinToHex} {
+    #local bin {%1};
+    #local hex {};
+
+    #if { "$bin" == "" } {
+        #return {};
+    };
+
+    #local len {@str.Len{$bin}};
+
+    #switch {$len % 4} {
+        #case {0}   {#0};
+        #case {1}   {#local bin {000$bin}};
+        #case {2}   {#local bin {00$bin}};
+        #case {3}   {#local bin {0$bin}};
+    };
+
+    #math len {(($len - 1) % 4 + 1) * 4};
+
+    #while {1} {
+        #if { @str.Len{$bin} < 1 } {
+            #return {$hex};
+        };
+        #local parts {$bin};
+        #replace parts {^%+4S%*$} {
+            {left}  {&1}
+            {right} {&2}
+        };
+        #local parts {$parts};
+        #switch {"$parts[left]"} {
+            #case {"0000"} {#cat hex {0}};
+            #case {"0001"} {#cat hex {1}};
+            #case {"0010"} {#cat hex {2}};
+            #case {"0011"} {#cat hex {3}};
+            #case {"0100"} {#cat hex {4}};
+            #case {"0101"} {#cat hex {5}};
+            #case {"0110"} {#cat hex {6}};
+            #case {"0111"} {#cat hex {7}};
+            #case {"1000"} {#cat hex {8}};
+            #case {"1001"} {#cat hex {9}};
+            #case {"1010"} {#cat hex {A}};
+            #case {"1011"} {#cat hex {B}};
+            #case {"1100"} {#cat hex {C}};
+            #case {"1101"} {#cat hex {D}};
+            #case {"1110"} {#cat hex {E}};
+            #case {"1111"} {#cat hex {F}};
+        };
+        #local bin {$parts[right]};
+    };
+};
+
+///=== {
+// #@ str.HexToBin <十六进制数字串>
+//    十六进制转二进制
+//
+//  EXAMPLE: \@str.HexToBin{0}
+//  RESULT:  {0000}
+//
+//  EXAMPLE: \@str.HexToBin{1}
+//  RESULT:  {0001}
+//
+//  EXAMPLE: \@str.HexToBin{2}
+//  RESULT:  {0010}
+//
+//  EXAMPLE: \@str.HexToBin{7}
+//  RESULT:  {0111}
+//
+//  EXAMPLE: \@str.HexToBin{8}
+//  RESULT:  {1000}
+//
+//  EXAMPLE: \@str.HexToBin{F}
+//  RESULT:  {1111}
+//
+//  EXAMPLE: \@str.HexToBin{f}
+//  RESULT:  {1111}
+//
+//  EXAMPLE: \@str.HexToBin{0B}
+//  RESULT:  {00001011}
+//
+//  EXAMPLE: \@str.HexToBin{01234ABCD}
+//  RESULT:  {000000010010001101001010101111001101}
+// };
+#func {str.HexToBin} {
+    #local hex {%1};
+    #local bin {};
+
+    #while {1} {
+        #local parts {$hex};
+        #if { @str.Len{$hex} < 1 } {
+            #return {$bin};
+        };
+        #replace parts {^%+1S%*$} {
+            {left}  {&1}
+            {right} {&2}
+        };
+        #local parts {$parts};
+        #local hex {$parts[right]};
+        #switch {"$parts[left]"} {
+            #case {"0"}     {#cat bin {0000}};
+            #case {"1"}     {#cat bin {0001}};
+            #case {"2"}     {#cat bin {0010}};
+            #case {"3"}     {#cat bin {0011}};
+            #case {"4"}     {#cat bin {0100}};
+            #case {"5"}     {#cat bin {0101}};
+            #case {"6"}     {#cat bin {0110}};
+            #case {"7"}     {#cat bin {0111}};
+            #case {"8"}     {#cat bin {1000}};
+            #case {"9"}     {#cat bin {1001}};
+            #case {"{A|a}"} {#cat bin {1010}};
+            #case {"{B|b}"} {#cat bin {1011}};
+            #case {"{C|c}"} {#cat bin {1100}};
+            #case {"{D|d}"} {#cat bin {1101}};
+            #case {"{E|e}"} {#cat bin {1110}};
+            #case {"{F|f}"} {#cat bin {1111}};
+        };
+    };
+};
+
+#func {bin2hex} {#return {@str.BinToHex{%0}}};
+#func {hex2bin} {#return {@str.HexToBin{%0}}};
+
 ///=== {
 // #@ str.Format <格式> <参数>
 //    执行 #format result <格式> <参数> 操作。