如何将Unicode编码输出转换为普通字符串?

3

你好,我目前正在将Delphi代码转换为.NET。他们的数据库中有加密功能,我已经解密了,但问题是输出结果是字节数组。

以下是我迄今为止所做的:

Private Function EnDeCrypt(ByVal Value As String) As String

    Dim transformed = Encoding.Unicode.GetBytes(Value).Select( _
        Function(item) Not item)
    Return Encoding.Unicode.GetString(transformed.ToArray())

End Function

结果:º»¯³¶½ = e d p l i b(不可打印字符)

我的问题是如何将输出转换为字符串。
非常感谢您的建议和帮助。


2
在调用 GetString() 之前,transformed.ToArray() 返回的原始字节的十六进制值是多少?通过使用 Encoding.Unicode,你的代码假定这些字节是 UTF-16 编码的,但显然不是这样,所以你需要使用不同的 Encoding,除非你的查询一开始就返回垃圾。我不熟悉 LINQ,你能解释一下这个查询到底是想要实现什么吗? - Remy Lebeau
这是我在你上一个问题中提出的编码问题。我怀疑当时我提出的问题仍然有效。 - David Heffernan
@remy,这个LINQ代码只是对输入执行按位取反操作。实际上,我就是写这段代码的人。我警告过OP它会产生无效的UTF-16编码,但OP坚称这绝对是所需的算法。 - David Heffernan
1个回答

1
简短的回答是,如果您的编码算法确实是UTF-16字符串的按位取反,则无法打印输出。该算法会产生不可打印的输出。
您可以在显示时添加额外的base64编码,以使您的代码中转换的取反字节可显示。
如果您想要更精确的帮助,我认为您需要解释上下文和您的动机。

你在说什么,David?这是我不知道的一些奇怪的C#或Delphi特性吗? - Maarten Bodewes
1
@owlstead 你不明白什么? - David Heffernan
Unicode与字节取反有什么关系?这是API中的某些实现特定细节吗? - Maarten Bodewes
问题中的代码将字符串转换为UTF-16编码的字节数组,然后执行按位取反操作。这就是我所说的。前一个问题为您提供了一些额外的上下文。 - David Heffernan
@owlstead 如果您只是生成一些随机的字节序列,那么它可能不是一个有效的Unicode字符串。 - MarkJ
@MarkJ:是的,谢谢,我明白了,我只是缺少前面问题中提供的一些上下文。 - Maarten Bodewes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接