[Console]::OutputEncoding = [Text.Encoding]::UTF8 $ErrorActionPreference = "Stop" function H2B($hex) { if (-not $hex) { return $null } $n = $hex.Length / 2 $b = New-Object byte[] $n for ($i = 0; $i -lt $n; $i++) { $b[$i] = [Convert]::ToByte($hex.Substring(2*$i, 2), 16) } return $b } function HexR($b, $o, $l) { return (($b[$o..($o+$l-1)] | ForEach-Object { $_.ToString("x2") }) -join "") } $lines = [IO.File]::ReadAllLines("$env:TEMP\opencode\ss123.tsv") $dmx = New-Object System.Collections.ArrayList $keys = New-Object System.Collections.ArrayList foreach ($l in $lines) { $p = $l -split "`t"; if ($p.Count -lt 5 -or -not $p[4]) { continue } $b = H2B $p[4] if ($p[1] -eq "192.168.123.113" -and $p[2] -eq "192.168.123.1" -and $b.Length -eq 1084 -and [int]$b[4] -eq 4 -and $b[0x20] -eq 1 -and $b[0x21] -eq 1) { [void]$dmx.Add(@{ t=[double]$p[0]; b=$b }) } # 密钥报文: 主机→广播 1947B 帧 if ($p[1] -eq "192.168.123.113" -and $p[2] -match "255" -and $b.Length -ge 1900) { [void]$keys.Add(@{ t=[double]$p[0]; b=$b }) } } Write-Host ("DMX-A={0} 密钥广播={1}" -f $dmx.Count, $keys.Count) # === 1. 相同通道数据的帧, 可变字节是否相同? === Write-Host "`n=== 相同通道数据帧的可变字节对比 ===" $byData = @{} foreach ($f in $dmx) { $dh = HexR $f.b 0x3C 64 # 前64通道作指纹 if (-not $byData.ContainsKey($dh)) { $byData[$dh] = New-Object System.Collections.ArrayList } [void]$byData[$dh].Add($f) } $groups = $byData.GetEnumerator() | Where-Object { $_.Value.Count -ge 2 } | Select-Object -First 3 $gcount = 0 foreach ($g in $groups) { $gcount++ Write-Host (" 组{0} ({1}帧):" -f $gcount, $g.Value.Count) foreach ($f in ($g.Value | Select-Object -First 4)) { Write-Host (" t={0,8:F3} 0x1A={1} 0x22={2}" -f $f.t, (HexR $f.b 0x1A 2), (HexR $f.b 0x22 8)) } } if ($gcount -eq 0) { Write-Host " (120s 内通道数据无重复 — 效果持续变化)" } # === 2. 可变字节是否随帧序平滑变化? 连续 8 帧的 0x22-0x29 === Write-Host "`n=== 连续 8 帧 0x1A/0x22 原始值 ===" foreach ($f in ($dmx | Select-Object -First 8)) { Write-Host (" t={0,8:F3} 0x1A={1} 0x22-0x29={2}" -f $f.t, (HexR $f.b 0x1A 2), (HexR $f.b 0x22 8)) } # === 3. 密钥广播结构 === if ($keys.Count -gt 0) { Write-Host "`n=== 密钥广播帧 (前2个) ===" foreach ($k in ($keys | Select-Object -First 2)) { Write-Host (" t={0,8:F3} len={1}" -f $k.t, $k.b.Length) Write-Host (" 0x00-0x2F: " + (HexR $k.b 0 0x30)) Write-Host (" 0x30-0x5F: " + (HexR $k.b 0x30 0x30)) } # 密钥帧之间是否相同 if ($keys.Count -ge 2) { $same = 0; $diff = 0 for ($i = 0; $i -lt [Math]::Min(0x100, $keys[0].b.Length); $i++) { if ($keys[0].b[$i] -eq $keys[1].b[$i]) { $same++ } else { $diff++ } } Write-Host (" 帧1vs帧2 前256B: 同={0} 异={1}" -f $same, $diff) } # 密钥帧间隔 $kg = New-Object System.Collections.ArrayList for ($i = 1; $i -lt $keys.Count; $i++) { [void]$kg.Add([int](($keys[$i].t - $keys[$i-1].t) * 1000)) } Write-Host (" 间隔ms: " + (($kg | Select-Object -First 12) -join ", ")) } # === 4. 0x22-0x29 是否 = f(通道数据)? 试常见简单哈希 === Write-Host "`n=== 0x22-0x29 vs 通道数据简单函数 ===" $m_add=0; $m_xor=0; $m_crc32=0 foreach ($f in ($dmx | Select-Object -First 100)) { $d = $f.b[0x3C..0x43B] # CRC32 (IEEE) $crc = [uint32]0xFFFFFFFF foreach ($v in $d) { $crc = $crc -bxor $v for ($j=0; $j -lt 8; $j++) { if ($crc -band 1) { $crc = ($crc -shr 1) -bxor 0xEDB88320 } else { $crc = $crc -shr 1 } } } $crc = $crc -bxor 0xFFFFFFFF $s0 = [uint32]$f.b[0x22] + [uint32]$f.b[0x23]*256 + [uint32]$f.b[0x24]*65536 + [uint32]$f.b[0x25]*16777216 $s1 = [uint32]$f.b[0x26] + [uint32]$f.b[0x27]*256 + [uint32]$f.b[0x28]*65536 + [uint32]$f.b[0x29]*16777216 if ($crc -eq $s0 -or $crc -eq $s1) { $m_crc32++ } } Write-Host (" CRC32(通道数据) 匹配 0x22或0x26: {0}/100" -f $m_crc32) # === 5. 常量字段 0x2C-0x3B 的稳定性 (是否随 universe 变化) === Write-Host "`n=== 0x2C-0x3B 常量确认 ===" $var34 = @{} foreach ($f in $dmx) { $h = HexR $f.b 0x2C 16; if (-not $var34.ContainsKey($h)) { $var34[$h] = 0 }; $var34[$h]++ } foreach ($kv in $var34.GetEnumerator()) { Write-Host (" {0} : {1}帧" -f $kv.Key, $kv.Value) }