ほっしーの技術ネタ備忘録

技術ネタの備忘録です。基本的に私が忘れないためのものです。他の人の役にも立つといいなぁ。

パケットのチェックサム再利用コード片

// チェックサム算出
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* にキャストしてやればバイトオーダー気にせずに計算できそう。
ただ末尾のパディングが面倒だからこのままでいいや...