C语言,提取数组数据,计算得32位的结果。(keil,读SD卡时,遇到的问题)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言,提取数组数据,计算得32位的结果。(keil,读SD卡时,遇到的问题)相关的知识,希望对你有一定的参考价值。

sdbuf[]=42,4D,50,20
想得到结果:0x20504D42
【曾用:
file=(sdbuf[3]<<24)+(sdbuf[2]<<16)+(sdbuf[1]<<8)+(sdbuf[0]<<0);( file定义32位)
却得到结果:0x00004D42】
【感谢回答,追问没成功,就补充问题吧】
sdbuf[]原为512字节,是从SD卡读取的数据,想得到结果0x20504D42,用来比较、计算。譬如这里的42 4D 50 20就是图片格式(BMP)。

参考技术A sdbuff是unsigned char 还是unsigned short
一般应该用前者
sdbuf[3]在左移的时候已经溢出了,所以是0,去看c语言,关于类型转换部分。
先把sdbuf[3]赋值到 file再移位。
file = sdbuf[3];
file<<=8;
file |=sdbuf[2];
file <<=8;
file |= sdbuf[1];如此反复才行
参考技术B 这个是典型的大端模式和小端模式的转换,如果是51的单片机,你只能自行修改,
file = sdbuf[3];
file = file<<8+sdbuf[2];
file = file<<8+sdbuf[1];
file = file<<8+sdbuf[0];
如果你用的是ARM,那就不用转换了,因为ARM也是小端模式的,直接就可以使用了。追问

多谢两位。
file = sdbuf[0x2A];
file = (file<<8)+sdbuf[0x29];
file = (file<<8)+sdbuf[0x28]; //文件类型

刚做完,16进制转字符串,所以现在回复,答案很满意。

本回答被提问者采纳
参考技术C 你可以在sdbuf[]赋值时,这样写,0x42,0x4D,0x50,0x42,去试试。追问

首先感谢你的回答,不过这里的sdbuf[]原为512字节,并非随便改变的数据,是从SD卡提取的,目标是:对提取42 4D 50 20,转化为32位后,用来比较、计算。譬如,这里的数据是图片格式(BMP )。

追答

你直接写成0x424D5042这样可以吗?

追问

不可以。这是变量。

参考技术D 同上

c语言中怎么处理一个特别大的数据的运算

比如说 112233445566778899 + 998877665544332211 = 1111111111111111110

最简单的办法是将大数当作字符串进行处理,也就是将大数用10进制字符数组进行表示,

然后模拟人们手工进行“竖式计算”的过程编写其加减乘除函数。但是这样做效率很低,

因为1024位的大数其10进制数字个数就有数百个,对于任何一种运算,都需要在两个有

数百个元素的数组空间上做多重循环,还需要许多额外的空间存放计算的进位退位标志

及中间结果。其优点是算法符合人们的日常习惯,易于理解。 

C语言简介:

是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

C语言特点:

1、C语言是一个有结构化程序设计、具有变量作用域递归功能的过程式语言。

2、C语言传递参数均是以值传递,另外也可以传递指针。

3、不同的变量类型可以用结构体组合在一起。

4、只有32个保留字,使变量、函数命名有更多弹性。

5、部份的变量类型可以转换,例如整型和字符型变量。

6、通过指针,C语言可以容易的对存储器进行低级控制。

7、预编译处理让C语言的编译更具有弹性。

参考技术A

//我的计算器只能计算 乘法 加法太简单了自己,拿我的程序自己去改

//可以计算最大100位乘100位的数字

//修改程序第2行的abc的数组大小可以把计算数据大小改成无限大

//所有的注释掉的输出都是在写程序的时候自己来看的

分成三部分

第一部分超大数存储  因为数据太大 超过了各种类型的存储 longlong 大概能存储20位

所以用数组来存储 每一位存入的一个数组中   

例如你输入 123456789

a[0]=9

a[1]=8

a[2]=7

...

a[8]=1

第二部分 计算

用小学的方法 一个一个数去计算 a[0]*b[0]的值存入c[0]中,如果c[0]大于10 就往前进一位,然后计算a[1]*b[0] 的值 存入 c[1] 中如果大于十就进位 如此类推 挨个计算

第三部输出 这个没什么好说的 自己看程序吧

#include<iostream>
using namespace std;
#include<stdio.h>
int main ()

int i,j,k,l,A,B,C;
char a[100],b[100],c[200]=0;
int x,y,z;
//-------------------------第一个数 输入步骤------------------------------------------------
cout<<"输入第一个数\\n";                    //输入第一个数   输入123
cin>>a;                                    //               a[0]=1百位 a[1]=2十位 a[2]=3个位
//cout<<"输入的数据为";
for(i=0;a[i]!='\\0';i++)                    //判断位数

//cout<<a[i];
//printf("%c",a[i]);

//cout<<"\\n数据为"<<i<<"位\\n";
A=i;
for(i=0;i<=(A-1)/2;i=i+1)                    //把第一个数据反向存储

k=a[i];
a[i]=a[A-i-1];
a[A-i-1]=k;

for(i=0;i<=A-1;i++)                         //测试第一个数据方向

//cout<<"第"<<i<<"个数字为"<<a[i]<<endl;

//--------------------------第二个数输入步骤---------------------------------------------
cout<<"输入第二个数\\n";                    //输入第二个数
cin>>b;
//cout<<"输入的数据为";
for(i=0;b[i]!='\\0';i++)                   //计算第二个数的位数

//cout<<b[i];

//cout<<"\\n数据为"<<i<<"位\\n";
B=i;
for(i=0;i<=(B-1)/2;i=i+1)                 //把第二个数据反向存储

k=b[i];
b[i]=b[B-i-1];
b[B-i-1]=k;

for(i=0;i<=B-1;i++)                        //测试第二个数据方向

//cout<<"第"<<i<<"个数字为"<<b[i]<<endl;

//-------------------------------核心计算步骤------------------------------------------
for(i=0;i<=B-1;i++)                          

for(j=0;j<=A-1;j++)

   //printf("a的值为%d b的值为%d\\n",a[j]-48,b[i]-48);
x=(a[j]-48)*(b[i]-48);  //计算相乘的结果
k=i+j;                  //计算存储的数组c的位置
c[k]=c[k]+x;            //计算存储完成后的值
x=c[k];
//printf("第%d位为%d\\n",k,c[k]);
for(l=0;c[k+l]>=10;l++)  //循环进位

//printf("第%d位为%d",k+l,c[k+l]);
c[k+l]=c[k+l]%10;
c[k+l+1]=x/10+c[k+l+1];
x=c[k+l+1];



//----------------------------------输出步骤------------------------------------------------
for(i=19;c[i]==0;i--)                   //计算结果数组的中的位数

   //printf("第%d个数字为%d\\n",i,c[i]);
if(c[i]==0)
            c[i]='\\0';

//cout<<"输出的结果为"<<i+1<<"位\\n";
j=i+1;
/* for(i=0;i<=j-1;i++)                       //测试第三个数据方向

cout<<"第"<<i<<"个数字为";
printf("%d\\n",c[i]);
 */
for(i=0;i<=(j-1)/2;i=i+1)                  //把数据反向存储

k=c[i];
c[i]=c[j-i-1];
c[j-i-1]=k;

/* for(i=0;i<=j-1;i++)                        //测试第三个数据方向

cout<<"第"<<i<<"个数字为";
printf("%d\\n",c[i]);
 */
    for(i=0;i<j;i++)
    
        printf("%d",c[i]);
    
    cout<<"\\n结果共计"<<j<<"位";

参考技术B 用double型算,结果%0.0ld输出 参考技术C 把数存到字符数组里,按位计算... 参考技术D http://zhidao.baidu.com/question/25581829.html大数运算参考这里,源码太多,贴不下

以上是关于C语言,提取数组数据,计算得32位的结果。(keil,读SD卡时,遇到的问题)的主要内容,如果未能解决你的问题,请参考以下文章

c语言,为啥int类型在16位系统中占2个字节,在32位系统中占4个字节?

C语言中“SIZEOF(INT)“是啥意思?有啥作用?

c语言中怎么将十六进制中的高位和低位分别存到数组中

C语言读取1位的BMP图

求用c语言黄金分割数的小数后100位的程序,并显示结果

C语言32位数据反序的问题