97 lines
4.4 KiB
PowerShell
97 lines
4.4 KiB
PowerShell
[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) }
|