c# - 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 ...”
如果这已经在某个地方得到了回答而我错过了,我很抱歉。任何示例或代码片段都值得赞赏。谢谢你。
解决方案
好吧,这些字节似乎是字符的 UTF16 表示。MULTI_SZ 包含多个以空字符串结尾的以空字符结尾的字符串(或者,如果您喜欢两个空字符结尾字符,但技术上第一个“属于”前一个字符串)。您向我们展示了两个字符串,每个字符串包含 4 个字符(加上空字符和结尾)
因此,要采取的步骤 - 获取每对十六进制字符并将它们转换为一个字节(有很多这样做的例子)。然后获取这个字节数组并使用System.Text.Encoding.Unicode
将这些字节转换为字符串。如今,大多数系统都可以处理包含空字符的字符串,并且在这里它们标记了分隔符,因此如果要将其拆分为单独的字符串,请在字符串转换后拆分为空字符。
但是,如果您只想存储这些字符串,并且您正在使用的任何数据库都可以使用字符串中的空字符,则将它们原封不动地传递。注意:如果您在访问数据库之前一直没有使用参数化查询,那么现在是学习的时候了。因为在不必进行大量手动重新处理和/或转义的情况下构造包含空字符的字符串文字通常很棘手。这通常是一个好习惯。
您在此处的字符串应包含字符T
, E
, S
, T
, null, D
, A
, T
, A
, null, null
推荐阅读
- linux - Cron 作业不适用于 EC2 Aws Ubuntu 18.04 实例?
- javascript - 我应该如何编译一个角度模块包?
- html - 如何使 CSS 动画在 IOS Chrome 上运行?
- bash - 将命令字符串的一部分存储为 bash 中的变量
- c - 在 C 中生成 1 到 100 之间的随机双精度
- reactjs - 将组件作为道具传递并在事件中使用它
- firebase - Flutter 和 FCM(Firebase 云消息传递)onMessage、onResume 和 onLaunch 在单击通知时未触发(包:firebase_messaging 7.0.0)
- java - 在wiremock中生成特定时间
- javafx - 有谁知道为什么我在我的 gradle 转换项目中得到“java.lang.reflect.InvocationTargetException”?
- javascript - 无法在 HTMLButtonElement 处读取 null 的属性“样式”