首页 > 解决方案 > C# 将文本文件中的 REG_MULTI_SZ 值转换为字符串

问题描述

我不是一个训练有素的程序员,但我确实写了一些代码(所以要温柔)。我正在编写代码来读取注册表文件并将值存储在 SQL 数据库中。根据计算机构建,我们推送不同的注册表文件。虽然我可以保留一个注册表文件文件夹,但拥有一个数据库可以更轻松地比较差异并跟踪注册表设置的更改。

也就是说,我可以轻松读取字符串和 dword 值,但 REG_MULTI_SZ 值有问题。例如,如何在注册表文件中进行转换?

"SampleMS"=hex(7):54,00,45,00,53,00,54,00,00,00,44,00,41,00,54,00,41,00,00,00,\ 00,00 (这是注册表文件中的 2 行文本,所以我知道我必须记帐。)

到注册表编辑器中显示的实际值: TEST DATA

我已经阅读了几个十六进制到字节数组和字节数组到字符串的示例,但似乎所做的只是给我字符串格式的十六进制值,例如“5400450053 ...”

如果这已经在某个地方得到了回答而我错过了,我很抱歉。任何示例或代码片段都值得赞赏。谢谢你。

标签: c#registry

解决方案


好吧,这些字节似乎是字符的 UTF16 表示。MULTI_SZ 包含多个以空字符串结尾的以空字符结尾的字符串(或者,如果您喜欢两个空字符结尾字符,但技术上第一个“属于”前一个字符串)。您向我们展示了两个字符串,每个字符串包含 4 个字符(加上空字符和结尾)

因此,要采取的步骤 - 获取每对十六进制字符并将它们转换为一个字节(有很多这样做的例子)。然后获取这个字节数组并使用System.Text.Encoding.Unicode将这些字节转换为字符串。如今,大多数系统都可以处理包含空字符的字符串,并且在这里它们标记了分隔符,因此如果要将其拆分为单独的字符串,请在字符串转换后拆分为空字符。

但是,如果您只想存储这些字符串,并且您正在使用的任何数据库都可以使用字符串中的空字符,则将它们原封不动地传递。注意:如果您在访问数据库之前一直没有使用参数化查询,那么现在是学习的时候了。因为在不必进行大量手动重新处理和/或转义的情况下构造包含空字符的字符串文字通常很棘手。这通常是一个好习惯。


您在此处的字符串应包含字符T, E, S, T, null, D, A, T, A, null, null


推荐阅读