十进制,十六进制,BCD码相互转换C程序
本人用过的十六进制、BCD码之间的转换C程序,还有十进制的,可以参考使用,
#include
#include
/////////////////////////////////////////////////////////
//
//功能:十进制转十六进制
//
//输入:int dec 待转换的十进制数据
// int length 转换后的十六进制数据长度
//
//输出:unsigned char *hex 转换后的十六进制数据
//
//返回:0 success
//
//思路:原理同十六进制转十进制
//////////////////////////////////////////////////////////
int DectoHex(int dec, unsigned char *hex, int length)
{
int i;
for(i=length-1; i>=0; i--)
{
hex[i] = (dec%256)&0xFF;
dec /= 256;
}
return 0;
}
/////////////////////////////////////////////////////
//
//功能:二进制取反
//
//输入:const unsigned char *src 二进制数据
// int length 待转换的二进制数据长度
//
//输出:unsigned char *dst 取反后的二进制数据
//
//返回:0 success
//
//////////////////////////////////////////////////////
int convert(unsigned char *dst, const unsigned char *src, int length) {
int i;
for(i=0; i { dst[i] = src[i]^0xFF; } return 0; } ////////////////////////////////////////////////////////// // //功能:十六进制转为十进制 // //输入:const unsigned char *hex 待转换的十六进制数据 // int length 十六进制数据长度 // //输出: // //返回:int rslt 转换后的十进制数据 // //思路:十六进制每个字符位所表示的十进制数的范围是0 ~255,进制为256 // 左移8位(<<8)等价乘以256 // ///////////////////////////////////////////////////////// unsigned long HextoDec(const unsigned char *hex, int length) { int i; unsigned long rslt = 0; for(i=0; i { rslt += (unsigned long)(hex[i])<<(8*(length-1-i)); } return rslt; } ///////////////////////////////////////////////////////// // //功能:求权 // //输入:int base 进制基数 // int times 权级数 // //输出: // //返回:unsigned long 当前数据位的权 // ////////////////////////////////////////////////////////// unsigned long power(int base, int times) { int i; unsigned long rslt = 1; for(i=0; i rslt *= base; return rslt; } ///////////////////////////////////////////////////////// // //功能:BCD转10进制 // //输入:const unsigned char *bcd 待转换的BCD码// int length BCD码数据长度 // //输出: // //返回:unsigned long 当前数据位的权 // //思路:压缩BCD码一个字符所表示的十进制数据范围为0 ~ 99,进制为100 // 先求每个字符所表示的十进制值,然后乘以权 ////////////////////////////////////////////////////////// unsigned long BCDtoDec(const unsigned char *bcd, int length) { int i, tmp; unsigned long dec = 0; for(i=0; i { tmp = ((bcd[i]>>4)&0x0F)*10 + (bcd[i]&0x0F); dec += tmp * power(100, length-1-i); } return dec; } ///////////////////////////////////////////////////////// // //功能:十进制转BCD码 // //输入:int Dec 待转换的十进制数据 // int length BCD码数据长度 // //输出:unsigned char *Bcd 转换后的BCD码 // //返回:0 success // //思路:原理同BCD码转十进制 // ////////////////////////////////////////////////////////// int DectoBCD(int Dec, unsigned char *Bcd, int length) { int i; int temp; for(i=length-1; i>=0; i--) { temp = Dec%100; Bcd[i] = ((temp/10)<<4) + ((temp%10) & 0x0F); Dec /= 100; } return 0; } int main() { register int i; unsigned char tmp_bff[12] = ""; //十六进制转十进制 unsigned char HEX[4] = {0x34, 0xFE, 0x3E, 0xFF}; unsigned long dec_hex = 0; dec_hex = HextoDec(HEX, 4); printf("dec_hex = %d\n", dec_hex); //十进制转十六进制 DectoHex(dec_hex, tmp_bff, 4); for(i=0; i<5; i++) { printf("tmp_bff[%d] = 0x%02X\n",i, tmp_bff[i]); } //BCD码转十进制 unsigned long dec_bcd = 0; unsigned char BCD[4] = {0x98, 0x23, 0x45, 0x78}; dec_bcd = BCDtoDec(BCD, 4); printf("dec_bcd = %d\n", dec_bcd); //十进制转BCD码 DectoBCD(dec_bcd, tmp_bff, 4); for(i=0; i<5; i++) { printf("tmp_bff[%d] = 0x%02X\n", i, tmp_bff[i]); } getchar(); } 其计算公式应是:任何一个十进制数表示的经、纬度数,其整数即是度数,其小数部分乘以60得到的数的整数部分即是分数,再用该数的小数部分乘以60 得到的数就是秒数。例:36.12432314转换成度分秒的数是:其度数是"36",其分是 "0.12432314×60=7.4593884"的整数"7",其秒是 "0.4593884×60=27.5639304","27.6"----36°7′27.6〃。 计算原理:保留取整部分,小数×60 经度:14° 0.32×60=19.2 --》19′ 0.2×60 =1.2 --》1.2〃 即:14°19′12〃同理,纬度:52.20 =52°12′0 经纬度的表示 1884年国际经度会议规定,以通过英国伦敦格林威治天文台子午仪中心的经线为0°经线。从0°经线往东叫东经,往西叫西经,东、西各分180°。习惯上以西经20°和东经160°为分界把地球分为东西两个半球。假如从地轴的正中间将地球切成南北两半,上边的一半叫北半球,下边的一半叫南半球。被切的这个平面,叫赤道面。赤道面与地球表面相交的线叫赤道。纬线从赤道往两极越来越短,到了两极就缩小成一个点了。科学家们把赤道定为0°纬线,从赤道向两极各分为90°,赤道以南叫南纬,赤道以北叫北纬。在计算机或GPS上经纬度经常用度、分、秒和度.度、分.分、秒.秒的混合方式进行表示,度、分、秒间的进制是60进制,度.度、分.分、秒.秒的进制是100进制,换算时一定要注意。可以近似地认为每个纬度之间的距离是不变的111KM,每分间1.85KM,每秒间31.8M。经度间的距离随纬度增高逐渐减小,可按一下公式计算: 经度1°长度=111.413cosφ一0.094cos3φ公里(纬度φ处)。 一般从GPS得到的数据是经纬度。经纬度有多种表示方法。 1.) ddd.ddddd,度 . 度的十进制小数部分(5位)例如:31.12035o 2.)ddd.mm.mmm,度 . 分 . 分的十进制小数部分(3位)例如31o10.335' 3.) ddd.mm.ss, 度 . 分 . 秒例如 31o12'42" 地球上任何一个固定的点都可以用确定的经纬度表示出来。 2010年8月21日Surda发表评论阅读评论 在正弦表达式SIN(a) 中,我们知道 a 代表是弧度数。 那计算角度30°正弦值公式为:=SIN(RADIANS(30)),由此知道函数RADIANS()可以将角度转化成弧度。 但在实际的工程测量中用到的是度、分、秒(如:126°12′36″)来记录并进行计算的,在Excel 中怎样用这些数据进行计算? 首先来了解下何为度、分、秒制? 什么是“度分秒”:把一個周角分成三百六十等份,每一份稱為一度的角。再把一度分成六十等份,每一份叫做一分。把一分再分成六十等份,每一份叫做一秒。所以一個周角等於360°,一度等於六十分,一分等於六十秒。 /*—–度、分、秒制﹝Sexagesimal System﹞是古希臘數學家托勒密﹝約85-165﹞採用了巴比倫人的六十進制而建立的。在他編寫的《天文集》這本書中,他把周角分成三百六十等份,每一份叫一度。同時他還把半徑先分為60等份,每一份又分為60個小份,每一小份再等分成六十個更小的份。至於用「°」「’」「‖」分別來表示度、分、秒,是1570年卡拉木開始用的,這已是在托勒密之後1400多年的事了。—–*/ 按”度分秒”定义的常规互换方法 度分秒–度 110°10’10‖= 110+10÷60+10÷3600 = 110.16944444444444444444444444444° 度–度分秒 110.16944444444444444444444444444° 得度=110° (110.16944444444444444444444444444-110)×60=10.16666666666666666666 6666666667 得分=10’ (10.166666666666666666666666666667-10)×60=10 得秒=10‖ 知道了运算原理,我们来看在Excel中度、度分秒是如何互换计算? 如图是通过公式并设置Excel 单元格格式实现的角度与―度分秒‖之间在的转换。 B2=A2/24设置B2单元格格式为自定义[h]“°”mm”′”ss”″” C2=B2*24设置C2单元格格式为自定义G/通用格式”°” 可以看出Excel把角度、度分秒互换直接采用时间格式处理方式。所以Excel中角度、度分秒互换 方法一: 度分秒=度数÷24 度数=度分秒×24 方法二:文本公式实现继续看上图 B3=TEXT(A3/24,‖[h]°mm′ss″‖) C3=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(B3,‖°‖,‖:‖),‖′‖,‖:‖),‖″‖,)*24 2010年8月21日Surda 在正弦表达式SIN(a) 中,我们知道 a 代表是弧度数。 那计算角度30°正弦值公式为:=SIN(RADIANS(30)),由此知道函数RADIANS()可以将角度转化成弧度。 但在实际的工程测量中用到的是度、分、秒(如:126°12′36″)来记录并进行计算的,在Excel 中怎样用这些数据进行计算 首先来了解下何为度、分、秒制 什么是“度分秒”:把一個周角分成三百六十等份,每一份稱為一度的角。再把一度分成六十等份,每一份叫做一分。把一分再分成六十等份,每一份叫做一秒。所以一個周角等於360°,一度等於六十分,一分等於六十秒。 /*—–度、分、秒制﹝Sexagesimal System﹞是古希臘數學家托勒密﹝約85-165﹞採用了巴比倫人的六十進制而建立的。在他編寫的《天文集》這本書中,他把周角分成三百六十等份,每一份叫一度。同時他還把半徑先分為60等份,每一份又分為60個小份,每一小份再等分成六十個更小的份。至於用「°」「’」「”」分別來表示度、分、秒,是1570年卡拉木開始用的,這已是在托勒密之後1400多年的事了。—–*/ 按”度分秒”定义的常规互换方法 度分秒–度 110°10’10”= 110+10÷60+10÷3600 = ° 度–度分秒 ° 得度=110° ×60= 得分=10’ ×60=10 得秒=10” 知道了运算原理,我们来看在Excel中度、度分秒是如何互换计算 如图是通过公式并设置Excel 单元格格式实现的角度与“度分秒”之间在的转换。 B2=A2/24设置B2单元格格式为自定义[h]“°”mm”′”ss”″” C2=B2*24设置C2单元格格式为自定义G/通用格式”°” 可以看出Excel把角度、度分秒互换直接采用时间格式处理方式。所以Excel中角度、度分秒互换 方法一: 度分秒=度数÷24 度数=度分秒×24 方法二:文本公式实现继续看上图GPS怎么把经纬度转换成标准的度分秒单位
十进制与度分秒转换
十进制与度分秒转换