• C语言实现按位拷贝


    在程序开发过程中,我们经常会用到按位拷贝一串二进制数,在此提供一个按位拷贝的函数给大家参考,函数源码如下:

     1 #define char_t   char  
     2 #define uint8_t  unsigned char  
     3 #define int8_t   signed char  
     4 #define uint16_t unsigned short  
     5 #define int16_t  signed short  
     6 #define uint32_t unsigned  long int  
     7 #define int32_t  signed long int  
     8     
     9 /* 
    10  * param[in]  SrcData: source data 
    11  * param[in]  StartsrcBit: start source bit(1, 2, 3, ...) 
    12  * param[in]  startdstbit: start destination bit(1, 2, 3, ...) 
    13  * param[in]  CopyLen: copy length 
    14  * param[out] DstData: destination data 
    15 */  
    16 void copy_data_by_bits(uint8_t *DstData, uint32_t startdstbit, uint8_t *SrcData,  uint32_t StartsrcBit, uint32_t CopyLen)  
    17 {  
    18     uint32_t copysrcbyte        = 0;  
    19     uint32_t copysrcbitofbyte   = 0;  
    20     uint32_t copydstbyte        = 0;  
    21     uint32_t copydstbitofbyte   = 0;  
    22     uint32_t dataLen            = CopyLen;  
    23     
    24     if ((NULL == SrcData) || (NULL == DstData)) {  
    25         printf("SrcData or DstData is NULL !!!
    ");  
    26         return;  
    27     }  
    28     
    29     while (dataLen > 0)  {  
    30         copydstbyte       = ((startdstbit + dataLen) / 8);  
    31         copydstbitofbyte  = ((startdstbit + dataLen) % 8);  
    32         copysrcbyte       = ((StartsrcBit + dataLen) / 8);  
    33         copysrcbitofbyte  = ((StartsrcBit + dataLen) % 8);  
    34     
    35         if (0 == copysrcbitofbyte) {  
    36             copysrcbitofbyte = 8;  
    37             copysrcbyte      = copysrcbyte - 1;  
    38         }  
    39     
    40         if (0 == copydstbitofbyte) {  
    41             copydstbitofbyte = 8;  
    42             copydstbyte      = copydstbyte - 1;  
    43         }  
    44     
    45         DstData[copydstbyte]  &= ~(1 << (copydstbitofbyte - 1));  
    46         if ((SrcData[copysrcbyte] & ((uint8_t)((uint8_t)1 << (copysrcbitofbyte - 1)))) != 0) {  
    47             DstData[copydstbyte] |= ((uint8_t)1 << (copydstbitofbyte - 1));  
    48         }  
    49         dataLen--;  
    50     }  
    51 }  

    测试代码:

     1 int main(void)   
     2 {  
     3     uint8_t SrcData[] = {0x12, 0x34, 0x56, 0x78};  
     4     uint32_t StartsrcBit = 3;  
     5     uint32_t CopyLen = 8;  
     6     uint8_t DstData[2] = {0};  
     7     uint32_t startdstbit = 8;  
     8     
     9     DstData[0] = 0xab;  
    10     copy_data_by_bits(DstData, startdstbit, SrcData, StartsrcBit, CopyLen);  
    11     printf("DstData[0]:%#04x  DstData[1]:%#04x
    ", DstData[0], DstData[1]);  
    12     
    13     return 0;  
    14 }  

    分析如下:

  • 相关阅读:
    Android studio 快捷键记录
    Android开发 判断目标Fragment是否在前台
    Android开发 build.gradle的使用记录
    Android开发 在Application用于初始化的工具类
    Android开发 因为模块化导致findViewById返回为空null
    Android开发 本地广播
    Android开发 报错: xxx does not have a NavController set on xxx
    Android开发 GridLayout网格布局
    Android开发 Fragment启动Activity在使用onActivityResult的一些问题
    Html 创建自定义标签并且被jQuery获取到
  • 原文地址:https://www.cnblogs.com/mrlayfolk/p/11965260.html
Copyright © 2020-2023  润新知