Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env pwsh
- Set-StrictMode -Version 5.0
- Class Bottom{
- [int[]]$encode_values=@(200,50,10,5,1,0)
- [string[]]$encode_chars=@(
- "$([char]0xd83e)$([char]0xdec2)"
- "$([char]0xd83d)$([char]0xdc96)"
- "$([char]0x2728)"
- "$([char]0xd83e)$([char]0xdd7a)"
- "$([char]0x002c)"
- "$([char]0x2764)$([char]0xfe0f)"
- )
- [string]$split_char="$([char]0xd83d)$([char]0xdc49)$([char]0xd83d)$([char]0xdc48)"
- [string[]]$encode_map=@()
- [hashtable]$decode_map=@{}
- [void]gen_maps(){
- [int]$num=0
- [int]$i=0
- [string[]]$ret=@()
- if($this.encode_map.count -eq 0){
- # generate encode_map
- (0..255) | % {
- $num=$_
- $ret=@()
- if($_ -eq 0){
- $ret+=$this.encode_chars[[array]::indexof($this.encode_values,$_)]
- }else{
- while($num -gt 0){
- for($i=0;$i -lt $this.encode_values.count;$i++){
- if($this.encode_values[$i] -gt 0 -and $num -ge $this.encode_values[$i]){
- $ret+=$this.encode_chars[$i]
- $num-=$this.encode_values[$i]
- break
- }
- }
- }
- }
- $ret+=$this.split_char
- $this.encode_map+=-join $ret
- }
- }
- if($this.decode_map.count -eq 0){
- # generate decode_map
- for($i=0;$i -lt $this.encode_map.count;$i++){
- $ret=$this.encode_map[$i].split($this.split_char)
- $this.decode_map.add($ret[0], $i)
- }
- }
- }
- [string]encode_byte([int]$num){
- return $this.encode_map[$num]
- }
- [int]decode_byte([string]$str){
- [int]$ret=0
- if($this.decode_map.ContainsKey($str)){
- $ret=$this.decode_map[$str]
- }else{
- throw "Cannot decode character: $str"
- }
- return $ret
- }
- [string]encode_string([string]$str){
- [System.Text.Encoding]$enc=[System.Text.Encoding]::UTF8
- [string[]]$arr=$enc.GetBytes($str) | % {
- $this.encode_byte($_)
- }
- return -join $arr
- }
- [string]decode_string([string]$str){
- [System.Text.Encoding]$enc=[System.Text.Encoding]::UTF8
- [string[]]$arr=$str.split((&{if($str -match "$([char]0x200b)"){"$([char]0x200b)"}else{$this.split_char}}))
- #[string[]]$arr=$str.TrimEnd().split((&{if($str -match "$([char]0x200b)"){"$([char]0x200b)"}else{$this.split_char}}))
- [int[]]$bytes=$arr.where({$_ -ne ""}) | % {
- $this.decode_byte($_)
- }
- return $enc.GetString($bytes)
- }
- Bottom(){
- $this.gen_maps()
- }
- }
- $bottom=[Bottom]::new()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement