如何将ASCII码转换为十六进制数的。那个朋友告诉我。(50分)

  • 主题发起人 主题发起人 阿波
  • 开始时间 开始时间

阿波

Unregistered / Unconfirmed
GUEST, unregistred user!
如何将ASCII码转换为十六进制数的。那个朋友告诉我。
 
Caption:=IntToHex(Byte('A'),2);
详见Delphi的帮助。
~~~~~~~~~~~~~~~~~
 
可以在具体点吗,急用的,回头在去研究了。谢谢了。
 
Caption:=IntToHex(ord('A'),2);
 

http://www.delphibbs.com/delphibbs/dispq.asp?lid=789970
 
谢谢大家了。
 
function HexByte(b: Byte): string;
const
HexDigs: array [0..15] of char = '0123456789ABCDEF';
var
bz: Byte;
begin
bz:= b and $F;
b:= b shr 4;
Result:= HexDigs + HexDigs[bz];
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
Label1.Caption := '';
for i := 1 to Length(Edit1.Text)do
begin
try
Label1.Caption := HexByte(StrToInt(Edit1.Text));
except
Beep;
end;
end;
end;

要是想把AscII的码值变成十六进制,这就是了。
输入AscII值100,得到十六进制64,要是把AscII字符变成十六进制,你再使用
Ord函数和Chr函数就可以了,自己可以参考帮助。
 
谢谢大家
 
阿波,不要怪我多管闲事。你看下面:
首先发现这个问题,发现[red]阿波[/red]的问题忽然[blue]笨波[/blue]出来谢谢大家(是不是登陆的时候忘了用哪个ID了呢?[:D][:D]),我就有点奇怪。
然后查看他们的专家分,都是100分,分别是对方给的。
希望不要这样欺骗自己,来这里是学东西的。记住了。[:)]
****************************************************
[red]问题:程序问题,请大家一定帮忙。 ( 积分:100, 回复:2, 阅读:53 )
分类:数据结构 ( 版主:gzpbx, 张剑波 )
来自:阿波, 时间:2001-12-15 8:34:00, ID:789571 [显示:小字体 | 大字体]
FE FE 68 01 00 00 00 00 00 68 01 02 65 F3 2C 16//发送命令读表号
68 01 00 00 00 00 00 68 81 08 65 F3 34 33 33 33 33 33 E5 16 //读取的当前表号
FE FE 68 01 00 00 00 00 00 68 01 02 4C F4 14 16//发送命令读电量
68 01 00 00 00 00 00 68 81 06 4C C4 58 54 CC 3C FC 16//读取的当前电量
上面的两组数据分别是发出的通讯格式命令和返回的数据格式,我以第一组数据(读取表号)给大家解释。
在读取表号时,最前面的两个FE FE 称为前导字符,用来唤醒串口的,可以是一到四个,一般加两个,前导字符
后面的第一个68称为起始符,它后的那组数据从第一个68后到第二个68前称为数据域,一般可以用来表示表号、
常数,局号等,它由6位数据构成,每位两个字节共十二字节(十进制数),在我们的发送的命令中一般就是表号,如本例中我发出的表号是1,表现出来就是第一个68后的01 00 00 00 00 00在发送过程中它从高位发起,每位两个字节,(如发出12345:传送的顺序因是(读取时正好相反,从低位读起):45 23 01 00 00 00(自动补0以符合每位两个字节)从第二个68(即第二起始符)后的第一位数01,称为控制
码,在通讯格式中它有专门的意义,也可以是02,当然意义和01不同,它后面跟的那位数02称为数据长度,表示
它后面的 数据有两位,如上例读表号中数据长度是02,它后面跟的数据是32 C0(在发送时先要自动给每位加
33,十六进制的,加几位由数据长度来定的,加后就是上面的数据65 F3),然后要从最后面算起(因为数据长度不定),最后面一位数据16称为结束符,
是定死的标志,它前面一定是校验码CS,(本例中是2C)它的大小由从一个起始68(它也在内),到CS之前所有数据的和所得。
现在我想可不可以直接输入一组十进制数:如表号,局号,456234,8976511等通过上述规律可以直接转换传送命令的通讯格式发送命令,并能将直接转换后的格式如上述中,我输入表号是1,转换的结果是:FE FE 68 01 00 00 00 00 00 68 01 02 65 F3 2C 16发送到剪贴板上,
读取数据时,由另外一个软件读出来的,我要把它粘贴在我窗口中的RICHEDIT中,并能根据上述规律转换成十进制数,反应在RICHEDIT下面的EDIT中,可以实现吗。最了,还要把表号也要反应出来,因为一般我们的这些数据中,数据域就表示的是表号。行吗?我给你发过去一个界面,
大概也可以表示我以上的思路,可能也是比较好笑的,你给指点指点好了。对了,对于读取数据时,读出的数据中可能也有前导字符的可能是一到四个,但对读数据没有实际意义。还有就是读取时是从低位读出的,如上述第二组中读出的电量:68 01 00 00 00 00 00 68 81 06 4C C4 58 54 CC 3C 4C 16//读取的当前电量
表号还是数据中的01 00 00 00 00 00,表示输入的表号是1,控制码是81,表示读取成功(先定死它),数据长度是06,表示读取的数据是六位:4C F4 58 54 CC 3C ,每位减33后(不知那个猪定的,叫什么余3码,并从低位读起后是:9 99 21 25 91 19,连起来就是99921259119,这就是最终读出的数据)。在我做的那个窗口中,
不是有个输入表号吗,我想当我输入表号后,点击旁边的确认后,下面的GROUPBOX击活,可以对里面的项目选择,进行修改并实现转换成数据命令发送到剪贴板上,不知如何实现,请教大座的大侠。如可指点,送出所有家当,多谢了。
FE FE 68 01 00 00 00 00 00 68 01 02 65 F3 2C 16//发送命令读表号
68 01 00 00 00 00 00 68 81 08 65 F3 34 33 33 33 33 33 E5 16 //读取的当前表号
FE FE 68 01 00 00 00 00 00 68 01 02 4C F4 14 16//发送命令读电量
68 01 00 00 00 00 00 68 81 06 4C C4 58 54 CC 3C FC 16//读取的当前电量
上面的两组数据分别是发出的通讯格式命令和返回的数据格式,我以第一组数据(读取表号)给大家解释。
在读取表号时,最前面的两个FE FE 称为前导字符,用来唤醒串口的,可以是一到四个,一般加两个,前导字符
后面的第一个68称为起始符,它后的那组数据从第一个68后到第二个68前称为数据域,一般可以用来表示表号、
常数,局号等,它由6位数据构成,每位两个字节共十二字节(十进制数),在我们的发送的命令中一般就是表号,如本例中我发出的表号是1,表现出来就是第一个68后的01 00 00 00 00 00在发送过程中它从高位发起,每位两个字节,(如发出12345:传送的顺序因是(读取时正好相反,从低位读起):45 23 01 00 00 00(自动补0以符合每位两个字节)从第二个68(即第二起始符)后的第一位数01,称为控制
码,在通讯格式中它有专门的意义,也可以是02,当然意义和01不同,它后面跟的那位数02称为数据长度,表示
它后面的 数据有两位,如上例读表号中数据长度是02,它后面跟的数据是32 C0(在发送时先要自动给每位加
33,十六进制的,加几位由数据长度来定的,加后就是上面的数据65 F3),然后要从最后面算起(因为数据长度不定),最后面一位数据16称为结束符,
是定死的标志,它前面一定是校验码CS,(本例中是2C)它的大小由从一个起始68(它也在内),到CS之前所有数据的和所得。
现在我想可不可以直接输入一组十进制数:如表号,局号,456234,8976511等通过上述规律可以直接转换传送命令的通讯格式发送命令,并能将直接转换后的格式如上述中,我输入表号是1,转换的结果是:FE FE 68 01 00 00 00 00 00 68 01 02 65 F3 2C 16发送到剪贴板上,
读取数据时,由另外一个软件读出来的,我要把它粘贴在我窗口中的RICHEDIT中,并能根据上述规律转换成十进制数,反应在RICHEDIT下面的EDIT中,可以实现吗。最了,还要把表号也要反应出来,因为一般我们的这些数据中,数据域就表示的是表号。行吗?我给你发过去一个界面,
大概也可以表示我以上的思路,可能也是比较好笑的,你给指点指点好了。对了,对于读取数据时,读出的数据中可能也有前导字符的可能是一到四个,但对读数据没有实际意义。还有就是读取时是从低位读出的,如上述第二组中读出的电量:68 01 00 00 00 00 00 68 81 06 4C C4 58 54 CC 3C 4C 16//读取的当前电量
表号还是数据中的01 00 00 00 00 00,表示输入的表号是1,控制码是81,表示读取成功(先定死它),数据长度是06,表示读取的数据是六位:4C F4 58 54 CC 3C ,每位减33后(不知那个猪定的,叫什么余3码,并从低位读起后是:9 99 21 25 91 19,连起来就是99921259119,这就是最终读出的数据)。在我做的那个窗口中,
不是有个输入表号吗,我想当我输入表号后,点击旁边的确认后,下面的GROUPBOX击活,可以对里面的项目选择,进行修改并实现转换成数据命令发送到剪贴板上,不知如何实现,请教大座的大侠。如可指点,送出所有家当,多谢了。


来自:笨波, 时间:2002-1-11 16:00:00, ID:850779
我有个类似的例子,把你的EMAIL发给我,给你好了。


来自:阿波, 时间:2002-1-11 16:04:00, ID:850792
谢谢了。
得分大富翁:笨波
[/red]
###############################################################################
[blue]问题:100分问一个关于串口通讯的小问题,不够的话不可以加的。谢谢了。 ( 积分:100, 回复:3, 阅读:26 )
分类:通讯/网络 ( 版主:kucio, redhat2000 )
来自:笨波, 时间:2002-1-10 15:42:00, ID:847985 [显示:小字体 | 大字体]
我编写了一段串口通信程序,可发送数据过程中发现发送的数据是一段一段发送,最后一条
才是我想发送的数据。 如:发送:FEFE123456,通过串口检测器,发现发送的是这样的数据:00,00FE,00FEFE。。。最后是FEFE123456不知为什么。我用的是MSCOMM。
如何更改可以让它直接发送完整的数据的。
原程序如下:
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Caption:=' 笨波' ;
MSComm1.InBufferCount:=0;
MSComm1.InputLen:=0;
MSComm1.RThreshold:=1;
MSComm1.Settings:='1200,e,8,1';
//,n,"(无校验)或",o,"(奇校验)或",e,"(偶校验)
//,m,"(校验位恒定为1)!
//,s,"(校验位恒定为0)!
MSComm1.CommPort:=1;
MSComm1.DTREnable:=true;
MSComm1.RTSEnable:=true;
MSComm1.PortOpen:=true;
Memo2.text:='';
Memo1.text:='';
ComboBox1.text:='1200,e,8,1';
ComboBox1.Items.Insert(0,'1200,e,8,1');
ComboBox1.Items.Insert(1,'2400,e,8,1');
ComboBox1.Items.Insert(2,'4800,e,8,1');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
s,datastr:string;
begin
s:=memo1.text;
for i:=0 to (length(s) div 2)-1do
begin
datastr:=datastr+chr(strtoint('$'+copy(s,i*2+1,2)));//十六进制发送;
MSComm1.Settings:=ComboBox1.text;
MSComm1.Output:=datastr;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if MSComm1.PortOpen=true then
MSComm1.PortOpen:=false;
close();
end;

procedure TForm1.MSComm1Comm(Sender: TObject);
var
recstr:Olevariant;
begin
MSComm1.Settings:=ComboBox1.text;
if Mscomm1.CommEvent=comEvReceive then
begin
recstr:=MSComm1.Input;
Memo2.text:=Memo2.text+recstr;
end;

end;
procedure TForm1.Formdestroy(Sender: TObject);
begin
if MSComm1.PortOpen=true then
MSComm1.PortOpen:=false;
end;

end.

'Text2.Text = Hex$(Asc(Text2.Text)) '(接收到的字符还原为16进制数据)这是在VB里的用法,
在DELPHI中如何将ASCII还原为十六进制的。


来自:笨波, 时间:2002-1-10 16:34:00, ID:848183
to:kucio
可以帮我解答吗?


来自:阿波, 时间:2002-1-11 12:08:00, ID:850098
是循环时出了问题了,
MSComm1.Settings:=ComboBox1.text;
MSComm1.Output:=datastr;
应放在循环外面。


来自:笨波, 时间:2002-1-11 12:21:00, ID:850121
接受答案了.


得分大富翁:阿波 [/blue]
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
911
SUNSTONE的Delphi笔记
S
后退
顶部