mirror of
https://github.com/Relintai/gdfxr.git
synced 2025-04-20 01:43:13 +02:00
39 lines
1.0 KiB
GDScript
39 lines
1.0 KiB
GDScript
extends Object
|
|
|
|
const BASE_58_ALPHABET := "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
|
|
|
|
|
|
static func b58decode(v: String) -> StreamPeerBuffer:
|
|
# Base 58 is a number expressed in the base-58 numeral system.
|
|
# When encoding data, big-endian is used and leading zeros are encoded as leading `1`s.
|
|
|
|
var original_length := v.length()
|
|
v = v.lstrip(BASE_58_ALPHABET[0])
|
|
var zeros := original_length - v.length()
|
|
|
|
var buffer := PoolByteArray()
|
|
buffer.resize(v.length()) # Won't be as long as base 58 string since the buffer is 256-based.
|
|
buffer.fill(0)
|
|
|
|
var length := 0
|
|
for c in v:
|
|
var carry := BASE_58_ALPHABET.find(c)
|
|
if carry == -1:
|
|
return null
|
|
var i := 0
|
|
while carry != 0 or i < length:
|
|
var pos := buffer.size() - 1 - i
|
|
carry += 58 * buffer[pos]
|
|
buffer[pos] = carry % 256
|
|
carry /= 256
|
|
i += 1
|
|
length = i
|
|
|
|
var result := StreamPeerBuffer.new()
|
|
for _i in zeros:
|
|
result.put_8(0)
|
|
result.put_data(buffer.subarray(buffer.size() - length, -1))
|
|
result.seek(0)
|
|
|
|
return result
|