gpt4 book ai didi

c# 相当于 clojure 中的 base64 + UrlTokenEncode

转载 作者:太空狗 更新时间:2023-10-30 01:03:39 27 4
gpt4 key购买 nike

我在 C# 中有一段代码对字符串进行编码并返回 URL 安全字符串(稍后解码)

string stringToEncrypt = "Winter is coming";

byte[] bytes = new byte[stringToEncrypt.Length * sizeof(char)];
System.Buffer.BlockCopy(stringToEncrypt.ToCharArray(), 0, bytes, 0, bytes.Length);

System.Web.HttpServerUtility.UrlTokenEncode(bytes).Dump();

Dump 来自 LinqPad .我用它来快速测试 C# 的点点滴滴

执行时返回 VwBpAG4AdABlAHIAIABpAHMAIABjAG8AbQBpAG4AZwA1

我现在正尝试通过 clojure 服务做同样的事情。使用 encode 库并通过 this answer 进行当我有

(String. (b64/encode (.getBytes email)) "UTF-8")

我得到 V2ludGVyIGlzIGNvbWluZw==,这是

  • 未进行 url 编码
  • 与 C# 版本不匹配。

尝试查看 UrlTokenEncode() 的 MSDN 文档,但没有太多关于其实现的详细信息以了解幕后发生的事情。

我可以在 clojure 中生成等效的字符串吗?

最佳答案

感谢 Robert 指出 UrlTokenEncode 的来源。它执行以下操作:

  1. 对输入字节进行 Base64 编码
  2. 用填充字符数(12)替换任何尾部填充 =
  3. +替换为-,将/替换为_

另一个重要细节是 C# 示例对字符串的 UTF-16 表示形式进行编码(每个字符 2 个字节)。为了说明这一点,这里有一个 Go Playground 的例子:http://play.golang.org/p/UlKMa7_OwV

此代码为您的测试输入生成预期的输出:

(ns blah.core
(:require [clojure.data.codec.base64 :as b64])
(:require [clojure.string :as string])
(:gen-class))

(defn encode [original]
(let [bytes_in (.getBytes original "UTF-16LE")
bytes_enc (b64/encode bytes_in)
bytes_len (alength bytes_enc)
pad_count (b64/pad-length bytes_enc 0 bytes_len)
enc_string (String. bytes_enc 0 (- bytes_len pad_count) "UTF-8")
enc_string (string/replace enc_string \+ \-)
enc_string (string/replace enc_string \/ \_)]
(str enc_string pad_count)))

(defn -main
[& args]
(let [message "Winter is coming"]
(println message)
(println (encode message))))

解码函数留给读者作为练习。

关于c# 相当于 clojure 中的 base64 + UrlTokenEncode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27235055/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com