@@ -62,7 +62,7 @@ func (sacp SACP_pack) Encode() []byte {
62
62
copy (result [13 :], sacp .Data )
63
63
}
64
64
65
- binary .LittleEndian .PutUint16 (result [len (result )- 2 :], sacp .U16Chksum (result [7 :], len (sacp .Data )+ 6 ))
65
+ binary .LittleEndian .PutUint16 (result [len (result )- 2 :], sacp .U16Chksum (result [7 :], uint16 ( len (sacp .Data ) )+ 6 ))
66
66
67
67
return result [:]
68
68
}
@@ -71,11 +71,11 @@ func (sacp *SACP_pack) Decode(data []byte) error {
71
71
if len (data ) < 13 {
72
72
return errInvalidSize
73
73
}
74
- if data [0 ] != 0xAA || data [1 ] != 0x55 {
74
+ if data [0 ] != 0xAA && data [1 ] != 0x55 {
75
75
return errInvalidSACP
76
76
}
77
77
dataLen := binary .LittleEndian .Uint16 (data [2 :4 ])
78
- if int ( dataLen ) != (len (data ) - 7 ) {
78
+ if dataLen != uint16 (len (data )- 7 ) {
79
79
return errInvalidSize
80
80
}
81
81
if data [4 ] != 0x01 {
@@ -84,7 +84,7 @@ func (sacp *SACP_pack) Decode(data []byte) error {
84
84
if sacp .headChksum (data [:6 ]) != data [6 ] {
85
85
return errInvalidChksum
86
86
}
87
- if binary .LittleEndian .Uint16 (data [len (data )- 2 :]) != sacp .U16Chksum (data [7 :], int ( dataLen ) - 2 ) {
87
+ if binary .LittleEndian .Uint16 (data [len (data )- 2 :]) != sacp .U16Chksum (data [7 :], dataLen - 2 ) {
88
88
return errInvalidChksum
89
89
}
90
90
@@ -100,31 +100,31 @@ func (sacp *SACP_pack) Decode(data []byte) error {
100
100
}
101
101
102
102
func (sacp * SACP_pack ) headChksum (data []byte ) byte {
103
- crc := 0
104
- poly := 7
103
+ crc := byte ( 0 )
104
+ poly := byte ( 7 )
105
105
for i := 0 ; i < len (data ); i ++ {
106
106
for j := 0 ; j < 8 ; j ++ {
107
- bit := data [i ]& 255 >> ( 7 - j ) & 1 == 1
108
- c07 := crc >> 7 & 1 == 1
107
+ bit := (( data [i ] & 0xff ) >> ( 7 - j ) & 0x01 ) == 1
108
+ c07 := ( crc >> 7 & 0x01 ) == 1
109
109
crc = crc << 1
110
110
if (! c07 && bit ) || (c07 && ! bit ) {
111
111
crc ^= poly
112
112
}
113
113
}
114
114
}
115
- crc = crc & 255
116
- return byte ( crc )
115
+ crc = crc & 0xff
116
+ return crc
117
117
}
118
118
119
- func (sacp * SACP_pack ) U16Chksum (package_data []byte , length int ) uint16 {
120
- check_num := uint64 (0 )
119
+ func (sacp * SACP_pack ) U16Chksum (package_data []byte , length uint16 ) uint16 {
120
+ check_num := uint32 (0 )
121
121
if length > 0 {
122
- for i := 0 ; i < length - 1 ; i += 2 {
123
- check_num += uint64 ( package_data [i ])<< 8 | uint64 (package_data [i + 1 ])
124
- check_num &= 0xffffffff // TODO: maybe just use uint32?
122
+ for i := 0 ; i < int ( length - 1 ) ; i += 2 {
123
+ check_num += uint32 (( uint32 ( package_data [i ])& 0xff ) << 8 | uint32 (package_data [i + 1 ]) & 0xff )
124
+ check_num &= 0xffffffff
125
125
}
126
126
if length % 2 != 0 {
127
- check_num += uint64 (package_data [length - 1 ])
127
+ check_num += uint32 (package_data [length - 1 ])
128
128
}
129
129
}
130
130
for check_num > 0xFFFF {
@@ -196,22 +196,27 @@ func SACP_connect(ip string, timeout time.Duration) (net.Conn, error) {
196
196
}
197
197
198
198
func SACP_read (conn net.Conn , timeout time.Duration ) (* SACP_pack , error ) {
199
-
200
199
var buf [SACP_data_len + 15 ]byte
201
200
202
201
deadline := time .Now ().Add (timeout )
203
202
conn .SetReadDeadline (deadline )
204
203
205
204
n , err := conn .Read (buf [:4 ])
206
- if err != nil || n != 4 {
205
+ if err != nil {
207
206
return nil , err
208
207
}
208
+ if n != 4 {
209
+ return nil , errInvalidSize
210
+ }
209
211
210
212
dataLen := binary .LittleEndian .Uint16 (buf [2 :4 ])
211
213
n , err = conn .Read (buf [4 : dataLen + 7 ])
212
- if err != nil || n != int ( dataLen + 3 ) {
214
+ if err != nil {
213
215
return nil , err
214
216
}
217
+ if n != int (dataLen + 3 ) {
218
+ return nil , errInvalidSize
219
+ }
215
220
216
221
var sacp SACP_pack
217
222
err = sacp .Decode (buf [:dataLen + 7 ])
0 commit comments