我试图以一种非常简单的方式实现 base64 编码。在我的方法中(让我们暂时搁置它是否合适)我需要反转字符串,然后将它们连接起来。之后,此连接字符串用于子字符串函数。字符串已正确连接,但是当我使用子字符串时 basex 似乎丢失了它。
有趣的是 substring 适用于从 8 开始的所有索引。因此 substring($string, 1, 8) 和更高版本可以提供正确的输出。但是下面的一切都搞砸了。从一个消失的数字开始: substring($string, 1, 7 (and below) ) 产生 6 长度的字符串。此外,子字符串只能从第 1 个或第 0 个索引开始。任何更大的结果都会导致空返回。
declare variable $array := []; declare function bs:encode ( $input as xs:string ) { bs:integer-to-binary(string-to-codepoints($input), "", $array) } ; declare function bs:integer-to-binary ( $input as xs:integer*, $string as xs:string, $array as array(xs:string) ) { let $strings := for $i in $input return if ($i != 0) then if ($i mod 2 = 0) then bs:integer-to-binary(xs:integer($i div 2), concat($string, 0), $array) else bs:integer-to-binary(xs:integer($i div 2), concat($string, 1), $array) else if ($i <= 0) then array:append($array, $string) return bs:check-if-eight($strings) } ; declare function bs:check-if-eight ( $strings as item()+ ) { let $fullBinary := for $string in $strings return if (string-length($string) < 8) then bs:check-if-eight(concat($string, 0)) else $string (: add as private below :) return bs:concat-strings($fullBinary) } ; declare function bs:concat-strings ( $strings as item()+ ) { let $firstStringToConcat := functx:reverse-string($strings[position() = 1]) let $secondStringToConcat := functx:reverse-string($strings[position() = 2]) let $thirdStringToConcat := functx:reverse-string($strings[position() = 3]) let $concat := concat ($firstStringToConcat, $secondStringToConcat, $thirdStringToConcat) (: this returns correct string of binary value for Cat word :) return bs:divide-into-six($concat) } ; declare function bs:divide-into-six ( $binaryString as xs:string) { let $sixBitString := substring($binaryString, 1, 6) (: this should return 010000 instead i get 000100 which is not even in $binaryString at all :) return $sixBitString } ; bs:encode("Cat")
我期望字符串(010000)中的前六个字母,而不是我猜的一些随机序列(00100)。整个模块旨在将字符串编码为 base64 格式,但现在(我上传的部分)应该只为“C”抛出前六位