【问题标题】:C# byte array to powershellC#字节数组到powershell
【发布时间】:2013-11-29 12:19:01
【问题描述】:

在 C# 代码中,我将字符串(示例PRmlyc3RuYW1lOj1FbW1hbnVlbMKkJMKkTGFzdE5hbWU6PURyZXV4wqQkwqRNYWlsYm94VHlwZTo9TWJ4)转换为字节数组,然后从 powershell 脚本将字节数组转换回字符串。 这会导致字符串的开头和结尾出现垃圾:

☺ ????☺ ♠☺ PRmlyc3RuYW1lOj1FbW1hbnVlbMKkJMKkTGFzdE5hbWU6PURyZXV4wqQkwqRNYWlsYm94VHlwZTo9TWJ4♂

C#代码:

byte[] array = ToByteArray(encodedParameters);

private byte[] ToByteArray(object source)
{
    var formatter = new BinaryFormatter();
    using (var stream = new MemoryStream())
    {
      formatter.Serialize(stream, source);
      return stream.ToArray();
    }
}

Powershell 解码:

$cmd = [System.Text.Encoding]::ASCII.GetString($buf, 0, $len)

或

$cmd = [System.Text.Encoding]::UTF8.GetString($buf, 0, $len)

或

$cmd = [System.Text.Encoding]::UNICODE.GetString($buf, 0, $len)

如果我在 C# 和 powershell 中转储字节数组,我会得到相同的缓冲区:

0 1 0 0 0 255 255 255 255 1 0 0 0 0 0 0 0 6 1 0 0 0 80 82 109 108 121 99 51 82 117 89 87 49 108 79 106 49 70 98 87 49 104 98 110 86 108 7 84 71 70 122 100 69 53 104 98 87 85 54 80 85 82 121 90 88 86 52 119 113 81 107 119 113 82 78 89 87 108 115 89 109 109 107 52 9 86 78> /p>

粗体接缝的字符是C#添加的额外字节,一种标题和结束字符。

问题:如何在没有这些额外垃圾的情况下将字符串恢复到 powershell 中?

【问题讨论】:

  • 你在 c# 中序列化,但在 powershell 中解码。

标签: c# arrays powershell byte


【解决方案1】:

C# 正在对 .NET 对象进行二进制序列化。这将包括对象的“原始数据”(例如字符串的字符、其他对象的字段)以及一些包含类型信息的额外内容。

powershell 没有反序列化 .NET 对象,它正在尝试解码编码字符串。编码与序列化不同,所以Encoding.ASCII.GetString 不太好用。

所以你有两个选择:

  • 在两边都使用序列化
    • 在powershell中使用BinaryFormatter.Deserialize将字节数组反序列化为字符串
  • 在两边都使用编码
    • 在 C# 中使用 Encoding.ASCII.GetBytes 将字符串编码为字节数组

【讨论】:

    【解决方案2】:

    那是因为您在 C# 中序列化数组,但在 Powershell 中对其进行解码。您需要在 C# 中对字符串进行编码,然后在 Powershell 中进行解码。

    或者,你可以在 Powershell 中反序列化,但这有点奇怪——编码和解码更有意义。

    对了,你为什么不能只传递一个字符串?

    【讨论】:

      猜你喜欢
      • 2016-11-17
      • 2018-02-28
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 2016-04-05
      • 1970-01-01
      相关资源
      最近更新 更多