打印
[STM32F1]

8位数组的200个数据怎么快速转换成16位数组100储存?

[复制链接]
4357|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电子过客|  楼主 | 2016-7-13 13:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
假如有个u8  a[200]里变得数组怎么 快速 转移到 u16 [100] 里
有什么好的方法吗?                         

沙发
JasonWangSE| | 2016-7-13 13:25 | 只看该作者
本帖最后由 JasonWangSE 于 2016-7-13 13:27 编辑

要是可以改定义就改成union;要是只能拷贝就调memcpy呗,一般库函数都会做优化的,或者用把DMA,不过才200字节有些用牛刀了。。。

使用特权

评论回复
板凳
xyz549040622| | 2016-7-13 13:40 | 只看该作者
JasonWangSE 发表于 2016-7-13 13:25
要是可以改定义就改成union;要是只能拷贝就调memcpy呗,一般库函数都会做优化的,或者用把DMA,不过才200 ...

再来就是老老实实的移位,组成新数据了。

使用特权

评论回复
地板
yklstudent| | 2016-7-13 13:52 | 只看该作者
要大端还是小端,然后强制转换赋值;
uint8_t lubTxBuffer[200];
uint16_t luwTxBuffer[100];
uint8_t i;
       
for(i=0; i<200; i++)
{
        lubTxBuffer[i] = i;
}
for(i=0; i<100; i++)
{
        luwTxBuffer[i] = *(uint16_t*)(&lubTxBuffer[i*2]);
}

使用特权

评论回复
5
电子过客|  楼主 | 2016-7-13 14:20 | 只看该作者
JasonWangSE 发表于 2016-7-13 13:25
要是可以改定义就改成union;要是只能拷贝就调memcpy呗,一般库函数都会做优化的,或者用把DMA,不过才200 ...

关键这是一个举例子
定义u8 a[200] 存储到时 u 16[0----100]
u8 c[200]存储到 u16 b  16[101----200]
等等好多的

使用特权

评论回复
6
JasonWangSE| | 2016-7-13 14:30 | 只看该作者
电子过客 发表于 2016-7-13 14:20
关键这是一个举例子
定义u8 a[200] 存储到时 u 16[0----100]
u8 c[200]存储到 u16 b  16[101----200]

啥意思,没看懂

使用特权

评论回复
7
电子过客|  楼主 | 2016-7-13 15:19 | 只看该作者

假如u16  b[ 500]
u8   a[200]   数据储存到    u16  b[ 0 -99]:
u8   c[200]   数据储存到    u16  b[ 100 -199]:
u8   d[200]   数据储存到    u16  b[ 200 -299]:
u8   e[200]   数据储存到    u16  b[ 300 -399]:
.....

使用特权

评论回复
8
JasonWangSE| | 2016-7-13 15:43 | 只看该作者
电子过客 发表于 2016-7-13 15:19
假如u16  b[ 500]
u8   a[200]   数据储存到    u16  b[ 0 -99]:
u8   c[200]   数据储存到    u16  b[  ...

memcpy性能达不到要求么?不行就试试DMA吧

使用特权

评论回复
9
airwill| | 2016-7-13 18:41 | 只看该作者
用强制转换, 啥都不用做了.

使用特权

评论回复
10
mmuuss586| | 2016-7-13 19:56 | 只看该作者
用联合体,共用地址;

使用特权

评论回复
11
戈卫东| | 2016-7-13 19:59 | 只看该作者
让一个U16 *得到数组的地址就可以了

使用特权

评论回复
12
justtest111| | 2016-7-13 20:19 | 只看该作者
戈卫东 发表于 2016-7-13 19:59
让一个U16 *得到数组的地址就可以了

也需要考虑大小端的吧?

使用特权

评论回复
13
runningwzf| | 2016-7-13 21:30 | 只看该作者
强制指针转换

使用特权

评论回复
14
ianhom| | 2016-7-13 22:36 | 只看该作者
要看大小端

使用特权

评论回复
15
949155525| | 2016-7-13 23:17 | 只看该作者
共用体

使用特权

评论回复
16
山东电子小菜鸟| | 2016-7-13 23:28 | 只看该作者
看了一下楼上各位大神的回答,都非常专业,但是我认为最简单的算法是如下:
unsigned char a[200];
unsigned int   b[100];
for(unsigned char i=0;i<100;i++)
{
b[i]=(unsigned int)((a[i]<<8)|a[i+1]);//或者b[i]=(unsigned int)((a[i+1]<<8)|a[i]);

}
就是如此的简单,楼上各位大神搞的好复杂呀

使用特权

评论回复
评论
ayl439 2016-7-14 08:37 回复TA
用联合体是最简单的 
17
zyj9490| | 2016-7-13 23:46 | 只看该作者
山东电子小菜鸟 发表于 2016-7-13 23:28
看了一下楼上各位大神的回答,都非常专业,但是我认为最简单的算法是如下:
unsigned char a[200];
unsigne ...

你的最大问题占用大量的RAM,给变量。

使用特权

评论回复
18
山东电子小菜鸟| | 2016-7-14 00:04 | 只看该作者
哈哈  无论什么方法都需要开辟u8 a[200], u16 b[100]空间的,你如果想存数据 必须开辟RAM空间,难道你有不需要空间存储变量的方法吗

使用特权

评论回复
评论
ayl439 2016-7-14 08:40 回复TA
联合体,呵呵! 
19
menfiss| | 2016-7-14 07:30 | 只看该作者
看样子可以用联合体吧

使用特权

评论回复
20
LearningASM| | 2016-7-14 08:37 | 只看该作者
u8  a[200]以什么样的形式变成 u16 b[100] ??

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

205

帖子

2

粉丝