将 base64 编码的字节转换为在 Javascript 和 C# 中不同的字符串

Converting base64 encoded bytes to string different in Javascript and C#

本文关键字:Javascript 字符串 编码 base64 字节 转换      更新时间:2023-09-26

我有一个图像,当我使用 JavaScriptC# 转换为Base64时,它给了我两个不同的值。 这是什么原因呢?

JavaScript 代码

  function LoadSvg() {
            var main = document.getElementById('svgimg');
            var data = main.innerHTML;
            debugger;
            var base64blob = Base64.encode(data);
            alert(base64blob);
            var image2 = document.getElementById('Img2');
            image2.src = 'data:image/svg+xml;base64,' + base64blob;
        }

C# 代码

string val=litSvg.Text;
byte[] arr = Encoding.UTF8.GetBytes(val);
string toBaseVal = Convert.ToBase64String(arr);      
ExternalHtml = 
   "<img id='"dfs'" src='"data:image/svg+xml;base64," + toBaseVal + "'" />";

在 JavaScript 中,main值和 C# val值是相同的。 这是怎么发生的? 如果我需要在 Java 脚本输出中使用相同的值,我该怎么做?

编辑:

价值 :

<svg xmlns='http://www.w3.org/2000/svg' version='1.1' width='470px' height='310px'><line x1='40' y1='10' x2='40' y2='250'style='stroke: rgb(0,0,0); stroke-width: 1' />...

主要价值 :

 <svg id="svg-code" xmlns="http://www.w3.org/2000/svg" version="1.1" width="470px" height="310px"> <line x1="40" y1="10" x2="40" y2="250" style="stroke: rgb(0,0,0); stroke-width: 1"></line>

O/P 值 :

base64blob : CiAgICAgICAgICAgICAgICAgICAgICA8.....

toBaseVal : PHN2ZyB4bWxucz0naHR0cDov ....

你的 Javascript 解码缓冲区在开头包含空格

LINEFEED SPACE SPACE SPACE < ...

$ echo "CiAgICAgICAgICAgICAgICA8" | base64 -d | hexdump -C -n 32
00000000  0a 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |.               |
00000010  20 3c                                             | <| 

C# 解码缓冲区正确

$ echo "PHN2ZyB4bWxucz0naHR0cDov" | base64 -d | hexdump -C -n 16
00000000  3c 73 76 67 20 78 6d 6c  6e 73 3d 27 68 74 74 70  |<svg xmlns='http|
00000010

不过,它们都有可能给出预期的结果

这里的问题是空格。

从 svg 文件中删除前导空格和尾随空格。此外 - 删除所有多余的空格,即。将 1+ 空格折叠为一个空格,并在 C# 中 - 像这样读取+转换文件:

byte[] arr = System.IO.File.ReadAllBytes(svf_file);
string toBaseVal = Convert.ToBase64String(arr);

不要管编码。

一个代码使用多余的空格计算 base64,另一个没有(因为它隐式删除它们) - 读取内部HTML