ℳℓ我ℳℓ已ℳℓ下ℳℓ线 2023-12-01 14:22 采纳率: 100%
浏览 42
已结题

c语言中如何将一个8位数组的数据传入一个16位的数组并数据无改变?

最近在学习stm32f407hal库的过程中遇到以下问题:
要求我们使用一个8位的指针将一组数据存入一个地址,再使用一个16位的指针读取并传入另一个地址,我个人写出来的是这样:

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "string.h"
#include "stdio.h"

void Read_ptr8(uint8_t *ptr,int length)
{
    for (int i = 0; i < length; i++) 
    {
        printf("%u ", ptr[i]);
    }
    printf("\n");
}

void Read_ptr16(uint16_t *ptr,int length)
{
    for (int i = 0; i < length; i++) 
    {
        printf("%u ", ptr[i]);
    }
    printf("\n");
}

int main(void) 
{
    uint8_t data_8bits[10] = {0};
    uint16_t data_16bits[10] = {0};
    uint8_t src[] = {1,2,3,4,5,6,7,8,9,0};
            
    uint8_t *ptr8 = data_8bits;
    uint16_t *ptr16 = data_16bits;
    
    HAL_Init();
    sys_stm32_clock_init(336, 8, 2, 7);
    delay_init(168);
    usart_init(115200);
    led_init();
            
    printf("\r\nReceived data:\r\n");
    
    for(int i = 0;i<sizeof(src);i++)
    {
        *(ptr8+i) = src[i];        
    }
    
    for(int i =0;i<sizeof(data_8bits);i++)
    {
        *(ptr16+i) = (uint16_t) *(ptr8+i);
    }
    
    
    printf("the data in src is :");
    Read_ptr8(src,sizeof(src));

    printf("the data in a is :");
    Read_ptr8(data_8bits,sizeof(data_8bits));
    
    printf("the data in b is :");
    Read_ptr16(data_16bits,sizeof(data_16bits));
    
    printf("\r\n\r\n");    
    
    delay_ms(5000);

}


其实际运行输入的结果为:

img


可以看到在传入数据后除了传入的数据还有一些无意义的数据,初步判断是因为位长不匹配导致的,希望能有人指点下迷津

  • 写回答

4条回答 默认 最新

  • 关注

    (1)sizeof(a)计算的是a占用内存的字节数,不是数组元素的个数,这个你搞混了,所以你的代码里传的参数是错误的;正确的写法应该是:
    sizeof(src) / sizeof(src[0])
    sizeof(data_8bits) / sizeof(data_8bits[0])
    sizeof(data_16bits) / sizeof(data_16bits[0])
    也就是用数组占用内存的大小除以1个元素占用内存的大小,得到的就是数组的长度。
    (2)不同类型数据转换需要考虑字节序的问题,也就是常说的大端小端问题,Linux和Unix的字节序正好相反,Windos根Linux字节序一致,所以,不管什么系统,再转换时都需要考虑字节序的问题,我写了两个函数,实现uint8_t* 和 uint16_t* 的相互转换。
    运行结果如下:

    img

    代码:

    #include <stdio.h>
    #include <stdint.h>
    union BigSml
    {
        uint16_t a;
        uint8_t b[2];
    };
    
    
    //将uint8_t*指向的数据保存到uint16_t*
    void Copy8t16(uint8_t* a,uint16_t* b,int n)
    {
        union BigSml test;
        int i;
        test.a = 1;
        if(test.b[0] == 0) //高位在前
        {
            for(i=0;i<n;i++)
            {
                test.b[0] = 0;
                test.b[1] = a[i];
                b[i] = test.a;
            }
        }else{
            for(i=0;i<n;i++)
            {
                test.b[1] = 0;
                test.b[0] = a[i];
                b[i] = test.a;
            }
        }
    }
    
    //将uint16_t*指向的数据保存到uint8_t*
    void Copy16t8(uint16_t* a,uint8_t* b,int n)
    {
        union BigSml test;
        int i;
        test.a = 1;
        if(test.b[0]==0)
        {
            for(i=0;i<n;i++)
            {
                test.a =a[i];
                b[i] = test.b[1];
            }
        }else{
            for(i=0;i<n;i++)
            {
                test.a = a[i];
                b[i] = test.b[0];
            }
        }
    }
    
    
    int main()
    {
        uint8_t a[] ={1,2,3,4,5};
        uint16_t b[20];
        uint8_t c[10];
        int i;
        //8-->16
        printf("8-->16:\n");
        Copy8t16(a,b,5);
        //显示拷贝的数据
        for(i=0;i<5;i++)
            printf("%u ",b[i]);
        printf("\n");
        //16-->8
        printf("16-->8:\n");
        Copy16t8(b,c,5);
        for(i=0;i<5;i++)
            printf("%u ",c[i]);
        printf("\n");
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 12月10日
  • 已采纳回答 12月2日
  • 创建了问题 12月1日

悬赏问题

  • ¥15 机器学习预测遇到的目标函数问题
  • ¥15 python的EOFError该怎么解决?
  • ¥15 Fluent,液体进入旋转区域体积分数不连续
  • ¥15 java linux下将docx文件转pdf
  • ¥15 maven无法下载依赖包
  • ¥15 关于pycharm, Callable[[str],bool]作为方法参数使用时, lambda 类型不提示问题
  • ¥15 layui数据重载无效
  • ¥15 寻找了解qq家园纵横四海的程序猿。
  • ¥15 optisystem
  • ¥15 VB.NET画图时的撤销编程