You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何拼接两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 15:04:09