87 lines
2.9 KiB
Go
87 lines
2.9 KiB
Go
package balisecodec
|
||
|
||
import (
|
||
"fmt"
|
||
"log/slog"
|
||
)
|
||
|
||
// 将830位的二进制数组以10位为单位组成一个左边为最高有效位(MSB)的无符号整数数组,然后求和后模2的10次方,得到的结果覆盖第一个10位值,然后将整个10位数组转换为二进制数组,依然是左边为MSB
|
||
func replaceFirst10Bits(b []byte) []byte {
|
||
if len(b) != 830 {
|
||
panic("invalid length")
|
||
}
|
||
// 将830位的二进制数组以10位为单位组成一个左边为最高有效位(MSB)的无符号整数数组
|
||
bits := make([]uint16, 83)
|
||
for i := 0; i < 83; i++ {
|
||
bits[i] = uint16(ToValLeftMsb(b[i*10 : i*10+10]))
|
||
// 打印输出
|
||
for j := 0; j < 10; j++ {
|
||
fmt.Printf("%01b", b[i*10+j])
|
||
}
|
||
print(" ")
|
||
if i != 0 && i%10 == 9 {
|
||
println()
|
||
}
|
||
}
|
||
println()
|
||
// 将每一个10位字整数求和后模2的10次方,得到的结果覆盖第一个10位值
|
||
sum := uint64(0)
|
||
for i := 0; i < 83; i++ {
|
||
sum += uint64(bits[i])
|
||
// fmt.Printf("i=%d, v10=%d, v10b=%010b\n", i, bits[i], bits[i])
|
||
}
|
||
bits[0] = uint16(sum % 1024)
|
||
slog.Info("替换第一个10位值", "sum", sum, "bits[0]", bits[0], "bits[0]b", fmt.Sprintf("%010b", bits[0]))
|
||
rbits := make([]byte, 830)
|
||
// 将整个10位数组转换为二进制数组,依然是MSB
|
||
u0bits := ToBitsLeftMsb(int(bits[0]), 10)
|
||
for i := 0; i < 10; i++ {
|
||
rbits[i] = u0bits[i]
|
||
}
|
||
for i := 10; i < 830; i++ {
|
||
rbits[i] = b[i]
|
||
}
|
||
// compare830(b, rbits)
|
||
return rbits
|
||
}
|
||
|
||
// 由加扰计算得到的S,作为初始状态为S的32位线性反馈移位寄存器对数据进行加扰
|
||
// 1. 生成一个32位的线性反馈移位寄存器,其初始状态为S(左边为MSB)
|
||
// 2. 系数h31,h30,h29,h27,h25和h0等于1(表示连接),所有其他系数都为0(表示不连接)
|
||
// 3. 然后电路被时钟驱动m-1次,其中m是数据位的数量,同时输入dn的每一位dn(m-1),dn(m-2),...,dn(0),便生成加扰后的码位(在第一个时钟之前读取第一个输出out(m-1))
|
||
// 4. 生成的加扰码位是dn的每一位与S的最高位的异或值
|
||
// 5. 生成的加扰码位会根据系数进行异或反馈回S的最低位
|
||
// 几种可能性:
|
||
func scrambling(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(out[i])
|
||
t = (xor << 30) ^ (xor << 29) ^ (xor << 28) ^ (xor << 26) ^ (xor << 24) ^ t
|
||
t = (t << 1) | xor
|
||
}
|
||
return out
|
||
}
|
||
|
||
// 将830位的二进制数组先以10位为一组分别转换为11位并组合
|
||
func convert830To913(b830 []byte) []byte {
|
||
if len(b830) != 830 {
|
||
panic("invalid length")
|
||
}
|
||
b913 := make([]byte, 913)
|
||
for i := 0; i < 83; i++ {
|
||
b11 := To11(b830[i*10 : i*10+10])
|
||
for j := 0; j < 11; j++ {
|
||
b913[i*11+j] = b11[j]
|
||
}
|
||
}
|
||
return b913
|
||
}
|