这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » Renesas » 谁能给我详细说HEX和ACSII之间转换的原理

共2条 1/1 1 跳转至

谁能给我详细说HEX和ACSII之间转换的原理

助工
2012-09-10 10:13:30     打赏
大侠们: 谁能给我详细说HEX和ACSII之间转换的原理。ACSII码和字符之间是不是有个30的关系, const unsigned char ascTable[17] = {"0123456789ABCDEF"}; void hex_2_acii(unsigned char *data_in,unsigned char *data_out,unsigned char len) { unsigned char *tmp_P = data_out; unsigned char i, pos = 0; for(i = 0; i 4]; tmp_P[pos++] = ascTable[data_in[i] & 0x0f]; } tmp_P[pos++] = '\"'; tmp_P[pos++] = '\r'; tmp_P[pos++] = '\n'; tmp_P[pos++] = '\0'; } 这个程序是HEX和ASCII之间转换的一个程序,为什么要把一个十六进制的数放单独放在一个存储单元? 小弟在这期待大侠的解答!!!!



关键词: 谁能     给我     细说     ACSII     之间     转换     原理    

高工
2012-09-10 10:37:36     打赏
2楼
const unsigned char ascTable[17] = {"0123456789ABCDEF"}; 
void hex_2_acii(unsigned char *data_in,   unsigned char *data_out,   unsigned char len) 
{
     unsigned char *tmp_P = data_out; 
     unsigned char i, pos = 0; 
    for(i = 0; i<len;i++} 
   {
       tmp_P[pos++] = ascTable[data_in[i] & 0x0f];
    }
   tmp_P[pos++] = '\"'; 
   tmp_P[pos++] = '\r'; 
   tmp_P[pos++] = '\n'; 
   tmp_P[pos++] = '\0';
 }


先整理下,好看多了,,

关HEX与ACSII的关系
数字的关系是+0x30(十六进制),字母什么的也有对应关系。

ASCII码表完整版

ASCII

控制字符

ASCII

控制字符

ASCII

控制字符

ASCII

控制字符

0

NUT

32

(space)

64

@

96

1

SOH

33

65

A

97

a

2

STX

34

66

B

98

b

3

ETX

35

#

67

C

99

c

4

EOT

36

$

68

D

100

d

5

ENQ

37

%

69

E

101

e

6

ACK

38

&

70

F

102

f

7

BEL

39

,

71

G

103

g

8

BS

40

(

72

H

104

h

9

HT

41

)

73

I

105

i

10

LF

42

*

74

J

106

j

11

VT

43

+

75

K

107

k

12

FF

44

,

76

L

108

l

13

CR

45

-

77

M

109

m

14

SO

46

.

78

N

110

n

15

SI

47

/

79

O

111

o

16

DLE

48

0

80

P

112

p

17

DCI

49

1

81

Q

113

q

18

DC2

50

2

82

R

114

r

19

DC3

51

3

83

X

115

s

20

DC4

52

4

84

T

116

t

21

NAK

53

5

85

U

117

u

22

SYN

54

6

86

V

118

v

23

TB

55

7

87

W

119

w

24

CAN

56

8

88

X

120

x

25

EM

57

9

89

Y

121

y

26

SUB

58

:

90

Z

122

z

27

ESC

59

;

91

[

123

{

28

FS

60

<

92

/

124

|

29

GS

61

=

93

]

125

}

30

RS

62

>

94

^

126

~

31

US

63

?

95

127

DEL



你可把FOR中写成如下减少代码大小,
for(i=0;i<len;i++)
{
       if( (data_in[i]&0x0f) <=0x09 )  data_out[i]=(data_in[i]&0x0f )+ 0x30;
       else if( (data_in[i]&0x0f) >0x09)
               data_out[i]=(data_in[i]&0x0f )+55;//大写字母A=65-10;
              
}

最后可以返回data_out的首地址。

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]