- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
有时字节数组b64是UTF-8,有时是UTF-16。我一直在网上阅读 C# 字符串始终是 UTF-16,但我这里不是这种情况。为什么会发生这种情况,我该如何解决?我有一个将 base64 字符串转换为普通字符串的简单方法:
public static string FromBase64(this string input)
{
String corrected = new string(input.ToCharArray());
byte[] b64 = Convert.FromBase64String(corrected);
if (b64[1] == 0)
{
return System.Text.Encoding.Unicode.GetString(b64);
}
else
{
return System.Text.Encoding.UTF8.GetString(b64);
}
}
同样的事情发生在我的 base 64 编码器上:
public static string ToBase64(this string input)
{
String b64 = Convert.ToBase64String(input.GetBytes());
return b64;
}
public static byte[] GetBytes(this string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
例子:在我的电脑上,“cABhAHMAcwB3AG8AcgBkADEA”解码为:
'p','\0','a','\0','s','\0','s','\0','w','\0','o','\0','r','\0','d','\0','1','\0'
但是在我同事的电脑上是:
'p','a','s','s','w','o','r','d','1'
编辑:
我知道我创建的字符串来自文本框,并且我保存它的文件始终是 UTF-8,所以所有内容都指向导致我的编码切换的 Convert 方法。
更新:
进一步深入研究后,我的同事似乎在他的代码版本中注释了一行非常重要的代码,即将从文件读取的值保存到哈希表中的那一行。我使用的默认值是 UTF-8 base64 值,因此我要将默认值更正为 utf-16 值,然后我可以清理代码,删除任何 UTF8 引用。
此外,我一直天真地使用从网站检索到的 UTF-8 base64 编码,却没有意识到自己陷入了什么境地。有趣的是,如果我的同事没有评论保存文件值的行,我永远不会发现这个事实。
代码的最终版本:
public static string FromBase64(this string input)
{
byte[] b64 = Convert.FromBase64String(input);
return System.Text.Encoding.Unicode.GetString(b64);
}
public static string ToBase64(this string input)
{
String b64 = Convert.ToBase64String(input.GetBytes());
return b64;
}
public static byte[] GetBytes(this string str)
{
return System.Text.Encoding.Unicode.GetBytes(str);
}
最佳答案
首先我要揭穿题名:
Convert.FromBase64String()
returns Unicode sometimes, or UTF-8
事实并非如此。然后提供相同的输入,有效的 base64 编码文本,Convert.FromBase64String()
总是返回相同的输出。
继续前进,您无法仅通过检查有效负载来明确确定用于字符串的编码。你试图用
if (b64[1] == 0)
// encoding must be UTF-16
事实并非如此。绝大多数 UTF-16 字符元素都无法通过该测试。无论您如何尝试编写此测试都注定要失败。这是因为当解释为不同的编码时,存在定义明确的字符串的字节数组。换句话说,例如,可以构造在被视为 UTF-8 或 UTF-16 时有效的字节数组。
因此,您必须先验地知道有效负载是编码为 UTF-16、UTF-8 还是其他编码。
解决方案是在 base64 编码之前跟踪原始编码。将该信息与 base64 编码的有效负载一起传递。然后在解码时,您可以确定使用哪种 Encoding
解码回字符串。
在我看来,您的字符串全部来自 UTF-16 .net 字符串。在这种情况下,您永远不会有 UTF-8 字符串,并且应该始终使用 UTF-16
进行解码。那就是你使用 Encoding.Unicode.GetString()
。
此外,您代码中的 GetBytes
方法很差。应该是:
public static byte[] GetBytes(this string str)
{
return Encoding.Unicode.GetBytes(str);
}
另一个奇怪的地方:
String corrected = new string(input.ToCharArray());
这是一个空操作。
最后,当编码为 UTF-8 时,您的文本很可能会更紧凑。因此,也许您应该考虑在应用 base64 编码之前这样做。
关于您的更新,您所说的不正确。这段代码:
string str = Encoding.Unicode.GetString(
Convert.FromBase64String("cABhAHMAcwB3AG8AcgBkADEA"));
将 password1
分配给 str
,无论它在哪里运行。
关于c# - Convert.FromBase64String 有时返回 unicode,或 UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21269900/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
在编码时,我问了自己这个问题: 这样更快吗: if(false) return true; else return false; 比这个? if(false) return true; return
如何在逻辑条件下进行“返回”? 在这样的情况下这会很有用 checkConfig() || return false; var iNeedThis=doSomething() || return fa
这是我的正则表达式 demo 如问题所述: 如果第一个数字是 1 则返回 1 但如果是 145 则返回 145 但如果是 133 则返回 133 样本数据a: K'8134567 K'81345678
在代码高尔夫问答部分查看谜题和答案时,我遇到了 this solution返回 1 的最长和最晦涩的方法 引用答案, int foo(void) { return! 0; } int bar(
我想在下面返回 JSON。 { "name": "jackie" } postman 给我错误。说明 Unexpected 'n' 这里是 Spring Boot 的新手。 1日龄。有没有正确的方法来
只要“is”返回 True,“==”不应该返回 True 吗? In [101]: np.NAN is np.nan is np.NaN Out[101]: True In [102]: np.NAN
我需要获取所有在 6 号或 7 号房间或根本不在任何房间的学生的详细信息。如果他们在其他房间,简单地说,我不希望有那个记录。 我的架构是: students(roll_no, name,class,.
我有一个表单,我将它发送到 php 以通过 ajax 插入到 mysql 数据库中。一切顺利,php 返回 "true" 值,但在 ajax 中它显示 false 消息。 在这里你可以查看php代码:
我在 Kotlin 中遇到了一个非常奇怪的无法解释的值比较问题,以下代码打印 假 data class Foo ( val a: Byte ) fun main() { val NUM
请注意,这并非特定于 Protractor。问题在于 Angular 2 的内置 Testability service Protractor 碰巧使用。 Protractor 调用 Testabil
在调试窗口中,以下表达式均返回 1。 Application.WorksheetFunction.CountA(Cells(4 + (i - 1) * rows_per_record, 28) & "
我在本地使用 jsonplaceholder ( http://jsonplaceholder.typicode.com/)。我正在通过 extjs rest 代理测试我的 GET 和 POST 调用
这是 Postman 为成功调用我的页面而提供的(修改后的)代码段。 var client = new RestClient("http://sub.example.com/wp-json/wp/v2
这个问题在这里已经有了答案: What to do with mysqli problems? Errors like mysqli_fetch_array(): Argument #1 must
我想我对 C 命令行参数有点生疏。我查看了我的一些旧代码,但无论这个版本是什么,都会出现段错误。 运行方式是 ./foo -n num(其中 num 是用户在命令行中输入的数字) 但不知何故它不起作用
我已经编写了一个类来处理命名管道连接,如果我创建了一个实例,关闭它,然后尝试创建另一个实例,调用 CreateFile() 返回 INVALID_HANDLE_VALUE,并且 GetLastErro
即使 is_writable() 返回 true,我也无法写入文件。当然,该文件存在并且显然是可读的。这是代码: $file = "data"; echo file_get_contents($fil
下面代码中的变量 $response 为 NULL,尽管它应该是 SOAP 请求的值。 (潮汐列表)。当我调用 $client->__getLastResponse() 时,我从 SOAP 服务获得了
我一直在网上的不同论坛上搜索答案,但似乎没有与我的情况相符的... 我正在使用 Windows 7,VS2010。 我有一个使用定时器来调用任务栏刷新功能的应用程序。在该任务栏函数中包含对 LoadI
我是一名优秀的程序员,十分优秀!