【问题标题】:string to byte array (to string to XML) and back again字符串到字节数组(到字符串到 XML)并再次返回
【发布时间】:2013-08-04 00:34:30
【问题描述】:

我知道有 100 万个关于“字符串 - 字节数组”转换的问题,但没有一个适合我的问题。

为了安装我的软件,我需要保存用户的一些信息(服务器地址、用户 ID、密码等)。其中一些信息确实需要保护(使用 DPAPI 加密)。为此,我必须将 string (SecureString) 转换为 byte[]

public static byte[] StringToByte(string s)
{
    return Convert.FromBase64String(s);
}

我的第一个问题在哪里。如果字符串长度不是 4 的倍数 (s.lenght % 4 == 0),我会收到“Base-64 字符数组的长度无效”错误。我读过我可以(必须)在string 的末尾添加“=”,但其中一些字符串可能是密码(可能包含“=”)。我需要将(加密的)数据存储在 XML 文件中,为什么我不能使用 Unicode 编码(我不知道为什么,但它会破坏 XML 文件……因为我想是因为编码)。

作为最后一步,我必须返回在应用启动时获取存储数据的方式。

有人可以帮我解决这个问题吗?我不在乎 XML 中的输出,只要它是“可读的”。

最好的问候亚历克斯

【问题讨论】:

    标签: c# string type-conversion bytearray


    【解决方案1】:

    我的第一个问题在哪里。如果字符串长度不是 4 的倍数(s.lenght % 4 == 0),我会收到“Base-64 字符数组的长度无效”错误。

    这表明它不是 base64 开头的。听起来您在这里走错了方向 - base64 用于将 binary 数据转换为文本。要将 text 转换为二进制形式,通常只需使用 Encoding.GetBytes:

    return Encoding.UTF8.GetBytes(text);
    

    现在,如果您需要将加密结果(将是二进制数据)编码为文本,那么您将使用 base64。 (因为加密 UTF-8 编码文本的结果是 not UTF-8 编码文本。)

    比如:

    public static string EncryptText(string input)
    {
        byte[] unencryptedBytes = Encoding.UTF8.GetBytes(input);
        byte[] encryptedBytes = EncryptBytes(unencryptedBytes); // Not shown here
        return Convert.ToBase64String(encryptedBytes);
    }
    
    public static string DecryptText(string input)
    {
        byte[] encryptedBytes = Convert.FromBase64String(input);
        byte[] unencryptedBytes = DecryptBytes(encryptedBytes); // Not shown here
        return Encoding.UTF8.GetString(unencryptedBytes);
    }
    

    【讨论】:

    • 很抱歉打扰你,乔恩,但我有一个与你所说的旧帖子相关的未决问题(从那时起,我将其作为一项规则),这是转换文本数据的最安全方法往返字节 [] 使用的是 base64,你的意思是在所有场景中还是只是在一些场景中?再次抱歉。
    • 公共静态字符串 ByteToString(byte[] bytes) { return Convert.ToBase64String(bytes); } public static byte[] StringToByte(string s) { return Encoding.UTF8.GetBytes(s); } 试过这个,但如果我使用它string s = ByteToString(StringToByte("test")); 结果是 "dGVzdA==" 这显然不是 "test"
    • @Alex:嗯,是的,因为现在您仍在使用Convert.ToBase64String 将字节转换为字符串!使用Encoding.GetString反转Encoding.GetBytes的操作。
    • @terrybozzio: 不 - 如果您开始使用任意二进制数据,则使用 Base64 获取文本,并且您可以通过这种方式返回相同的二进制数据.如果您开始使用文本数据,请使用普通编码,例如 UTF-8。
    • @Alex:你明白为什么你应该在两种不同的情况下使用不同的编码吗?如果没有,那么值得进一步考虑。基本上就是根据原始数据的类型确定编码的问题。
    猜你喜欢
    • 1970-01-01
    • 2015-05-24
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多