如何拼接两个Byte数组并返回Byte数组?解决PowerShell中UTF8带BOM字节数组拼接返回Object数组的问题
解决PowerShell中拼接Byte数组得到Object数组的问题
这个问题其实是PowerShell数组拼接的默认行为导致的:当你用+操作符合并两个数组时,PowerShell默认会创建一个Object[]类型的数组,即使两个输入数组都是Byte[]。这是因为PowerShell的数组操作是通用化的,默认以Object为基类型来容纳所有元素。
下面给你几种可靠的解决方法,都能得到预期的Byte[]数组:
方法1:手动创建Byte数组并复制内容(最高效)
这种方法直接分配足够大小的Byte数组,然后分别复制BOM和字符串的Byte内容,适合处理大数组时使用:
$inputStr = "hello world" $encoding = [System.Text.Encoding]::UTF8 $preamble = $encoding.GetPreamble() $contentBytes = $encoding.GetBytes($inputStr) # 创建总长度的Byte数组 $bytesWithBom = New-Object byte[] ($preamble.Length + $contentBytes.Length) # 复制BOM到开头 [Array]::Copy($preamble, $bytesWithBom, $preamble.Length) # 复制内容到BOM之后的位置 [Array]::Copy($contentBytes, 0, $bytesWithBom, $preamble.Length, $contentBytes.Length) # 验证类型 $bytesWithBom.GetType()
输出会是:
IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Byte[] System.Array
方法2:强制类型转换(最简洁)
既然拼接后的所有元素都是Byte类型,我们可以直接把结果强制转换为[byte[]]:
$inputStr = "hello world" $encoding = [System.Text.Encoding]::UTF8 $bytes = $encoding.GetBytes($inputStr) $bytesWithBom = [byte[]]($encoding.GetPreamble() + $bytes) # 验证类型 $bytesWithBom.GetType()
这种方法代码量少,适合简单场景,只要确保拼接的两个数组都是Byte[]就不会有问题。
方法3:使用Linq的Concat方法(更优雅)
利用.NET的Linq扩展方法来合并两个Byte序列,再转为数组:
$inputStr = "hello world" $encoding = [System.Text.Encoding]::UTF8 $preamble = $encoding.GetPreamble() $contentBytes = $encoding.GetBytes($inputStr) $bytesWithBom = [System.Linq.Enumerable]::Concat($preamble, $contentBytes).ToArray() # 验证类型 $bytesWithBom.GetType()
这种方式语法更直观,不过需要PowerShell 3.0及以上版本(默认支持Linq)。
为什么原来的方法不行?
再补充一下:PowerShell中+操作符处理数组时,会把两个数组的元素都放到一个新的Object[]数组里,哪怕元素都是Byte。这是PowerShell的设计决定——它优先保证兼容性,而不是严格保留原数组类型。所以必须通过上述方法显式指定或创建Byte数组,才能得到预期的结果。
内容的提问来源于stack exchange,提问作者Scott Langham
相关产品推荐
相关产品推荐

