C#字节数组到powershell

Clo*_*ere 2 c# arrays powershell byte

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

☺?????☺♠☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Powershell解码:

$cmd = [System.Text.Encoding]::ASCII.GetString($buf, 0, $len)
Run Code Online (Sandbox Code Playgroud)

要么

$cmd = [System.Text.Encoding]::UTF8.GetString($buf, 0, $len)
Run Code Online (Sandbox Code Playgroud)

要么

$cmd = [System.Text.Encoding]::UNICODE.GetString($buf, 0, $len)
Run Code Online (Sandbox Code Playgroud)

如果我在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 57 52 86 72 108 119 11

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

问题:如何在没有额外垃圾的情况下将字符串返回到PowerShell中?

lat*_*kin 5

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

powershell没有反序列化.NET对象,它试图解码编码的字符串.编码与序列化不同,因此Encoding.ASCII.GetString不能正常工作.

所以你有两个选择:

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