// チェックサム算出 uint32_t sum = 0; for(size_t i=0; i<size; i+=2) { sum += (buffer[i] << 8) | buffer[i+1]; } if( size & 1 ) sum += (data[size-1] << 8); sum = (sum >> 16) + (sum & 0xffff); sum = (sum >> 16) + (sum & 0xffff); checksum = htons(~sum);
// チェックサム確認 uint32_t sum = 0; for(size_t i=0; i<size; i+=2) { sum += (data[i] << 8) | data[i+1]; } if( size & 1 ) sum += (data[size-1] << 8); sum = (sum >> 16) + (sum & 0xffff); sum = (sum >> 16) + (sum & 0xffff); if( sum != 0xffff ) // ミスマッチ
チェックサムは補数を記録する ( 正負逆転 - 1 ) から、
何も考えずに和をとって -1 になれば整合確認ができることに気づいた。
あと、桁上がりが下に回ってくる関係上、
uint16_t* にキャストしてやればバイトオーダー気にせずに計算できそう。
ただ末尾のパディングが面倒だからこのままでいいや...