Advertisement
krishean

bottom.ps1

Mar 30th, 2021
1,342
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/usr/bin/env pwsh
  2. Set-StrictMode -Version 5.0
  3. Class Bottom{
  4.     [int[]]$encode_values=@(200,50,10,5,1,0)
  5.     [string[]]$encode_chars=@(
  6.         "$([char]0xd83e)$([char]0xdec2)"
  7.         "$([char]0xd83d)$([char]0xdc96)"
  8.         "$([char]0x2728)"
  9.         "$([char]0xd83e)$([char]0xdd7a)"
  10.         "$([char]0x002c)"
  11.         "$([char]0x2764)$([char]0xfe0f)"
  12.     )
  13.     [string]$split_char="$([char]0xd83d)$([char]0xdc49)$([char]0xd83d)$([char]0xdc48)"
  14.     [string[]]$encode_map=@()
  15.     [hashtable]$decode_map=@{}
  16.     [void]gen_maps(){
  17.         [int]$num=0
  18.         [int]$i=0
  19.         [string[]]$ret=@()
  20.         if($this.encode_map.count -eq 0){
  21.             # generate encode_map
  22.             (0..255) | % {
  23.                 $num=$_
  24.                 $ret=@()
  25.                 if($_ -eq 0){
  26.                     $ret+=$this.encode_chars[[array]::indexof($this.encode_values,$_)]
  27.                 }else{
  28.                     while($num -gt 0){
  29.                         for($i=0;$i -lt $this.encode_values.count;$i++){
  30.                             if($this.encode_values[$i] -gt 0 -and $num -ge $this.encode_values[$i]){
  31.                                 $ret+=$this.encode_chars[$i]
  32.                                 $num-=$this.encode_values[$i]
  33.                                 break
  34.                             }
  35.                         }
  36.                     }
  37.                 }
  38.                 $ret+=$this.split_char
  39.                 $this.encode_map+=-join $ret
  40.             }
  41.         }
  42.         if($this.decode_map.count -eq 0){
  43.             # generate decode_map
  44.             for($i=0;$i -lt $this.encode_map.count;$i++){
  45.                 $ret=$this.encode_map[$i].split($this.split_char)
  46.                 $this.decode_map.add($ret[0], $i)
  47.             }
  48.         }
  49.     }
  50.     [string]encode_byte([int]$num){
  51.         return $this.encode_map[$num]
  52.     }
  53.     [int]decode_byte([string]$str){
  54.         [int]$ret=0
  55.         if($this.decode_map.ContainsKey($str)){
  56.             $ret=$this.decode_map[$str]
  57.         }else{
  58.             throw "Cannot decode character: $str"
  59.         }
  60.         return $ret
  61.     }
  62.     [string]encode_string([string]$str){
  63.         [System.Text.Encoding]$enc=[System.Text.Encoding]::UTF8
  64.         [string[]]$arr=$enc.GetBytes($str) | % {
  65.             $this.encode_byte($_)
  66.         }
  67.         return -join $arr
  68.     }
  69.     [string]decode_string([string]$str){
  70.         [System.Text.Encoding]$enc=[System.Text.Encoding]::UTF8
  71.         [string[]]$arr=$str.split((&{if($str -match "$([char]0x200b)"){"$([char]0x200b)"}else{$this.split_char}}))
  72.         #[string[]]$arr=$str.TrimEnd().split((&{if($str -match "$([char]0x200b)"){"$([char]0x200b)"}else{$this.split_char}}))
  73.         [int[]]$bytes=$arr.where({$_ -ne ""}) | % {
  74.             $this.decode_byte($_)
  75.         }
  76.         return $enc.GetString($bytes)
  77.     }
  78.     Bottom(){
  79.         $this.gen_maps()
  80.     }
  81. }
  82. $bottom=[Bottom]::new()
  83.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement