智能终端定制开发 ad
MTK/瑞芯微/高通-Android,智能模块/智能终端方案商

深度定制各类智能终端和智能硬件产品,提供硬件选型咨询、参考设计、元器件推荐、驱动开发、行业模块集成、操作系统定制与算法集成等软硬件定制服务。
contact.aspx

Android核心板产品覆盖2G、3G、4G通讯,双核、四核、八核CPU,可选的平台有MTK6580、MTK6737、MTK6750等,Android版本有5.1 6.0 7.0等。
contact.aspx

可广泛应用于低端智能POS、安防监控、车载设备、低端智能机器人、智能家居、智能硬件、工业智能手持设备、低端智能对讲设备、低端警务或执法设备、智能穿戴、贩卖机、物流柜、智能门禁系统等行业和设备。
contact.aspx

可提供以太网转串口透传,WIFI转串口透传,蓝牙转串口透传,CAN总线模拟量控制输出模块等。
contact.aspx

带3G或4G通讯功能,运行android系统,有多个串口,可以外挂各种模块:条码扫描、RFID、指纹识别、身份证识别、磁条卡、ID卡、GPS/北斗模块等。
contact.aspx

具有4G通讯功能,多个RS232或RS485接口,以太网接口,USB接口,CAN接口,多个AD输入。基于Android系统智能平台,方便APP应用开发。器件严格选型,运行稳定,质量可靠。
contact.aspx

little-endian和big-endian问题
[WinCE WM] 2009-05-02

Little-Endian是说低位字节在前,Big-Endian反之,所以翻成大尾小尾有歧义;只说大头小头也有点含糊。
还不如就叫“低位字节开头”和“高位字节开头”。

 

1 关于Endian这个词语

[quote] endian”这个词出自Jonathan Swift 的《格列佛游记》。其中交战的两个派别无法就应该从哪一端--小端(Little-Endian)还是大端(Big-Endian)打开一个半熟的鸡蛋达成一致。由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。在那个时代,Swift是在讽刺英国和法国之间的持续冲突,Danny Cohen,一位网络协议的早期开创者,第一次使用这两个术语来指代字节顺序,后来这个术语被广泛接纳了 [/quote]

摘自《深入理解计算机系统》

我们一般将endian翻译成“字节序”,将big endianlittle endian称作“大尾”和“小尾”。

2 基本概念

         [1]在设计计算机系统的时候,有两种处理内存中数据的方法。一种叫为little-endian,存放在内存中最低位的数值是来自数据的最右边部分。比如一个16进制数字0x12345678 在内存存放的方式如下(Assume Base Address is 0x100):

01111000(0x78)

01010110(0x56)

00110100(0x34)

00010010(0x12)

地址(0x)

100

101

102

103

Intel 的处理器(我们普通的PC机)就是采用“little-endian”字节顺序

        另一种称为big-endian,正好相反,存放在内存中最低位的数值是来自数据的最左边部分。比如一个16进制数字0x12345678 在内存存放的方式如下:

    

00010010(0x78)

00110100(0x56)

01010110(0x34)

01111000(0x12)

地址(0x)

100

101

102

103

Motorala的处理器(MAC机)采用“big-endian”字节顺序

3 哪种方法更好[2]

你可能看见过很多关于这两种形式的相对优点的讨论,最激烈的争论是关于PCMAC的相对优点。这两种形式都有其优点和缺点。

在“little-endian”形式中,提取一个,两个,四个或者更长字节数据的汇编指令以与其他所有格式相同的方式进行:首先在偏移地址为0的地方提取最低位的字节,因为地址偏移和字节数是一对一的关系,多重精度的数学函数就相对地容易写了。

在“big-endian”的形式中,靠首先提取高位字节,你总是可以由看看在偏移位置为0的字节来确定这个数字是正数还是负数。你不必知道这个数值有多长,或者你也不必跳过一些字节来看这个数值是否含有符号位。这个数值是以它们被打印出来的顺序存放的,所以从二进制到十进制的函数特别有效。

4  C代码(它们之间的转换和判断)

/** \fn           is_little_endian(void)

 *    \brief       判断是否是"little_endian"字节序

 *    \param   

 *    \return     1:little_endian  0:big_endian

 */

char is_little_endian(void)

{

       int bit = 1;

       char *p = (char *)&bit;

       return *p;

}

 

/** \fn            reverse_big_little_endian(int N)

 *    \brief       "big_endian""little_endian"的相互转换

 *    \param    int N:要转换的数据

 *    \return     返回转换的结果

 */

int reverse_big_little_endian(int N)

{

       int reverse;

       char bit0, bit1, bit2, bit3;

      

       bit0 = (N & 0x000000ff);

       bit1 = (N & 0x0000ff00) >> 8;

       bit2 = (N & 0x00ff0000) >> 16;

       bit3 = (N & 0xff000000) >> 24;

      

       reverse = (bit0 << 24) | (bit1 << 16) | (bit2 << 8) | (bit3);

       return reverse;

}

[WinCE WM添加评论 | 评论/阅读(0/344)
评论
昵称
主页
内容
递交


Copyright @ 我的开发笔记     2008 - 2017         粤ICP备19155526号-1