Private/Get-EbmlElementFromBuffer.ps1
|
function Get-EbmlElementFromBuffer { <# .SYNOPSIS Reads a complete EBML element from a buffer (ID + size + data). .PARAMETER Buffer Byte array to read from .PARAMETER Offset Starting position in buffer .OUTPUTS [hashtable] @{ ElementID = [byte[]], DataSize = [uint64], ElementData = [byte[]], TotalLength = [int] } #> [CmdletBinding()] param( [Parameter(Mandatory=$true)] [byte[]]$Buffer, [Parameter(Mandatory=$true)] [int]$Offset ) $idResult = Get-EbmlElementID -Buffer $Buffer -Offset $Offset $elementID = $idResult.ElementID $idLength = $idResult.Length $sizeOffset = $Offset + $idLength $firstByte = $Buffer[$sizeOffset] $sizeByteCount = Get-EbmlUIntLength -LengthDescriptor $firstByte $dataSize = Get-EbmlUInt -Buffer $Buffer -Offset $sizeOffset -ByteCount $sizeByteCount $dataOffset = $sizeOffset + $sizeByteCount $available = [Math]::Max(0, $Buffer.Length - $dataOffset) if ($dataSize -gt $available) { $dataSize = [uint64]$available } $elementData = New-Object byte[] $dataSize [System.Array]::Copy($Buffer, $dataOffset, $elementData, 0, [int]$dataSize) $totalLength = $idLength + $sizeByteCount + $dataSize return @{ ElementID = $elementID DataSize = $dataSize ElementData = $elementData TotalLength = $totalLength } } |