![](/img/trans.png)
[英]C memcpy unsigned char to 1 element unsigned char array for checksum calculation
[英]apply checksum in c to a char
您如何將Checkksum應用於c中的char?
校驗和將位的序列減少為較短的序列,以使對較大序列的更改導致對較短校驗和的隨機更改。
字符已經很小。 要產生校驗和,您將需要一個位域。 實際上,您將需要兩個,因為僅一個位域至少會被填充為一個完整的字節。
struct twochars_checksum {
unsigned sum_a : CHAR_BIT / 2;
unsigned sum_b : CHAR_BIT / 2;
};
void sum_char( char c, struct twochars_checksum *dest, int which ) {
int sum;
sum = c ^ c >> CHAR_BIT / 2; // suboptimal, but passable
if ( which == 0 ) {
dest->sum_a = sum;
} else {
dest->sum_b = sum;
}
}
建議采用類似的方法來傳輸帶有校驗和的數據字節。
計算校驗和的算法非常簡單,如下所示。
1.檢查該位是否開啟,然后將相應的位值(即位位置的冪2)加到校驗和。
2.如果該位為off,則用1來檢測和。
注意:您可以通過更改函數calculate_checksum()使用自己的校驗和算法。
您可以在set_transfer_data()中包含自己的處理邏輯。
#include <stdio.h>
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
#define NUM_BITS (8)
uint16_t calculate_checksum(const uint8_t data)
{
uint16_t checksum = 0;
uint8_t bit_index = 0;
uint8_t bit_value = 0;
while( bit_index < NUM_BITS )
{
bit_value = 1 << bit_index++;
checksum += ( data & bit_value ) ? bit_value : -1;
}
return ( checksum );
}
uint8_t set_transfer_data( uint32_t *dest_data , const uint8_t src_data , const uint16_t checksum )
{
uint8_t return_value = 0;
*dest_data = checksum << NUM_BITS | src_data ;
return ( return_value );
}
int main()
{
uint8_t return_value = 0;
uint8_t source_data = 0xF3;
uint32_t transfer_data = 0;
uint16_t checksum = 0;
checksum = calculate_checksum( source_data );
printf( "\nChecksum calculated = %x",checksum );
return_value = set_transfer_data( &transfer_data,source_data,checksum );
if( 0 == return_value )
{
printf( "\nChecksum added successfully; transfer_data = %x",
transfer_data );
}
else
{
printf( "\nError adding checksum" );
}
return ( 0 );
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.