2024-08-08 13:23:25 +08:00
|
|
|
|
package balisecodec
|
2024-08-07 14:40:49 +08:00
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"log/slog"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// 将830位的二进制数组以10位为单位组成一个左边为最高有效位(MSB)的无符号整数数组,除了第一个10位值,其余值求和,然后循环2的10次方次与其他值求和结果相加后模2的10次方,若结果和第一个10位值相同,则结束,此值即为原始的第一个10位值,将此值替换为第一个10位二进制数组,依然是左边为MSB
|
|
|
|
|
func revertFirst10Bits(b []byte) []byte {
|
|
|
|
|
if len(b) != 830 {
|
|
|
|
|
panic("invalid length")
|
|
|
|
|
}
|
|
|
|
|
// 将830位的二进制数组以10位为单位组成一个左边为最高有效位(MSB)的无符号整数数组
|
|
|
|
|
w10s := make([]uint16, 83)
|
|
|
|
|
for i := 0; i < 83; i++ {
|
|
|
|
|
w10s[i] = uint16(ToValLeftMsb(b[i*10 : i*10+10]))
|
2024-08-08 13:38:56 +08:00
|
|
|
|
//// 打印输出
|
|
|
|
|
//for j := 0; j < 10; j++ {
|
|
|
|
|
// fmt.Printf("%01b", b[i*10+j])
|
|
|
|
|
//}
|
|
|
|
|
//print(" ")
|
|
|
|
|
//if i != 0 && i%10 == 9 {
|
|
|
|
|
// println()
|
|
|
|
|
//}
|
2024-08-07 14:40:49 +08:00
|
|
|
|
}
|
2024-08-08 13:38:56 +08:00
|
|
|
|
//println()
|
2024-08-07 14:40:49 +08:00
|
|
|
|
// 将除了第一个10位字整数求和
|
|
|
|
|
sum := uint64(0)
|
|
|
|
|
for i := 1; i < 83; i++ {
|
|
|
|
|
sum += uint64(w10s[i])
|
|
|
|
|
}
|
|
|
|
|
// 循环2的10次方次与其他值求和结果相加后模2的10次方
|
|
|
|
|
for i := 0; i < 1024; i++ {
|
|
|
|
|
test := sum + uint64(i)
|
|
|
|
|
if test%1024 == uint64(w10s[0]) {
|
|
|
|
|
w10s[0] = uint16(i)
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
slog.Info("还原第一个10位值", "sum", sum, "bits[0]", w10s[0], "bits[0]b", fmt.Sprintf("%010b", w10s[0]))
|
|
|
|
|
bits := make([]byte, 830)
|
|
|
|
|
// 将整个10位数组转换为二进制数组,依然是MSB
|
|
|
|
|
u0bits := ToBitsLeftMsb(int(w10s[0]), 10)
|
|
|
|
|
for i := 0; i < 10; i++ {
|
|
|
|
|
bits[i] = u0bits[i]
|
|
|
|
|
}
|
|
|
|
|
for i := 10; i < 830; i++ {
|
|
|
|
|
bits[i] = b[i]
|
|
|
|
|
}
|
|
|
|
|
return bits
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 解扰,由加扰计算得到的S,作为初始状态为S的32位线性反馈移位寄存器对数据进行解扰
|
|
|
|
|
func descrambling(dn []byte, S uint32) []byte {
|
|
|
|
|
if len(dn) != 830 {
|
|
|
|
|
panic("invalid length")
|
|
|
|
|
}
|
|
|
|
|
// const Polynomial = 0x000000AF
|
|
|
|
|
out := make([]byte, len(dn))
|
|
|
|
|
t := S // 寄存器初始值
|
|
|
|
|
for i := 0; i < len(dn); i++ {
|
|
|
|
|
msb := (t >> 31) & 1
|
|
|
|
|
out[i] = (dn[i] ^ byte(msb)) & 1
|
|
|
|
|
// fmt.Printf("i=%d, t=%032b, msb=%d, dn=%d, out=%d\n", i, t, msb, dn[i], out[i])
|
|
|
|
|
xor := uint32(dn[i])
|
|
|
|
|
t = (xor << 30) ^ (xor << 29) ^ (xor << 28) ^ (xor << 26) ^ (xor << 24) ^ t
|
|
|
|
|
t = (t << 1) | xor
|
|
|
|
|
}
|
|
|
|
|
return out
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 转换913位数据为830位数据
|
|
|
|
|
func convert913To830(b913 []byte) ([]byte, error) {
|
|
|
|
|
if len(b913) != 913 {
|
|
|
|
|
panic("invalid length")
|
|
|
|
|
}
|
|
|
|
|
b830 := make([]byte, 830)
|
|
|
|
|
for i := 0; i < 83; i++ {
|
|
|
|
|
b10, err := From11(b913[i*11 : i*11+11])
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, buildError(err.Error())
|
|
|
|
|
}
|
|
|
|
|
for j := 0; j < 10; j++ {
|
|
|
|
|
b830[i*10+j] = b10[j]
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return b830, nil
|
|
|
|
|
}
|