不能结合的原因是什么?Chr($A) + Copy(SendStr,1,1) + Chr($B) + Copy(SendStr,2,1) 比如说有一串十六进制的字符(33ADEF),我用下面的代码想实现的结果是:A3B3ADEF,但结果却是0A330BADEFChr($A) + Copy(SendStr,1,1) + Chr($B) + Copy(SendStr,2,1)请问导致这个结果的原因是什么?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 呵,你要的不就是个字符串吗?'A' + Copy(SendStr,1,1) + 'B' + Copy(SendStr,2,1) + 'ADEF' 我要的是这个字符串,但结果不对,我要的结果是:A3B3ADEF但这段代码给出的结果是:0A330BADEF 1、vkeyj(楼上) == shattered (楼主) ??????2、你要什么?把你的代码换成'A' + Copy(SendStr,1,1) + 'B' + Copy(SendStr,2,1)不是吗? 看看这个是不是你想要的:var SendStr:String; B:Byte;begin SendStr:=#$33#$AD#$EF; B:=Ord(SendStr[1]); SendStr:=Char((B and $F)or $A0)+Char(((B and $F0) shr 4) or $B0) + Copy(SendStr,2,2);........ lihuasoft(学习低调做人) 是的,因为vkeyj没有分了! 我开玩笑的。担心不是楼主在问。抱歉了。你的33ADEF是字符串吧,然后你想得到A3B3ADEF这样一个字符串是吧。把你的目的详细说明一下,我帮你! 这样吧,你先研究一下我刚才给你写的这个代码:var W, W2 : LongWord; X, X2 : string;begin W := 3386863; X := Format('%x',[W]);//字符串33ADEF ShowMessage(X);//字符串33ADEF X2 := 'A' + Copy(X,1,1) + 'B' + Copy(X,2,1) + Copy(X,3,4);//字符串A3B3ADEF ShowMessage(X2);//字符串A3B3ADEF W2 := StrToInt('$' + X2);//十六进数A3B3ADEF转为数2746461679 ShowMessage(IntToStr(W2));end;不明白再说哪里不明白。 我要把"0 --23点整"转换成十六进制,通过串口发送到出去,"0 --23点整"转换成十六进制 30B5E3D5FB0909 31B5E3D5FB0909 32B5E3D5FB0909 33B5E3D5FB0909 34B5E3D5FB0909 35B5E3D5FB0909 36B5E3D5FB0909 37B5E3D5FB0909 38B5E3D5FB0909 39B5E3D5FB0909 3130B5E3D5FB0909 3131B5E3D5FB0909 3132B5E3D5FB0909 3133B5E3D5FB0909 3134B5E3D5FB0909 3135B5E3D5FB0909 3136B5E3D5FB0909 3137B5E3D5FB0909 3138B5E3D5FB0909 3139B5E3D5FB0909 3230B5E3D5FB0909 3231B5E3D5FB0909 3232B5E3D5FB0909 3233B5E3D5FB0909 我要的就是把数字(0 --23)的十六进制变成3X(X;表示0--9)变成A3BX形式和A3BXA3BX(这是数字10--23所要表达的方式)我是通过判断第三个字符是否等于3来进行的,代码如下: : if copy(SendStr,4,1)<> '3' then begin SendStr:=Chr($10) + Chr($54) + Chr($49) + (Chr($A) + Copy(SendStr,1,1)) + Chr($B) + Copy(SendStr,2,1) + copy(SendStr,3,12) + Chr($4D) + Chr($45) + Chr($0D) + Chr($0A); end else if copy(SendStr,4,1)= '3' then begin SendStr:=Chr($10) + Chr($54) + Chr($49) + Chr($A) + Copy(SendStr,1,1) + Chr($B) + Copy(SendStr,2,1)+ Chr($A) + Copy(SendStr,4,1) + Chr($B) + Copy(SendStr,5,1)+copy(SendStr,7,12) + Chr($4D) + Chr($45) + Chr($0D) + Chr($0A); end;但结果不是我想要的得到A3B3ADEF形式,却是0A330BADEF形式,我想知道这是为什么? 请先举例说明一下30B5E3D5FB0909是什么数据(说明一下类型)的十六进制字符串形式 这样吧,你先研究一下我刚才给你写的这个代码:var W, W2 : LongWord; X, X2 : string;begin W := 3386863; X := Format('%x',[W]);//字符串33ADEF ShowMessage(X);//字符串33ADEF X2 := 'A' + Copy(X,1,1) + 'B' + Copy(X,2,1) + Copy(X,3,4);//字符串A3B3ADEF ShowMessage(X2);//字符串A3B3ADEF W2 := StrToInt('$' + X2);//十六进数A3B3ADEF转为数2746461679 ShowMessage(IntToStr(W2));end;不明白再说哪里不明白。比我多了个IntToStr,其它功能都一样 30B5E3D5FB(那个0909是空格)是"0点整"的十六进制字符串形式下面就以此类推! 哦,那是因为我不知你要的是什么类型的数据,所以多加上的一层转换。这样吧:你要的就是把字串按你的规则转换为新的字串,是吧。你把30B5E3D5FB0909和3130B5E3D5FB0909这两个转换后的希望结果写出来,我帮你写一个小函数。 30B5E3D5FB0909 ----> ????3130B5E3D5FB0909 ----> ???? 请问---lihuasoft(学习低调做人) ,产生这个ERRO的原因是什么?30B5E3D5FB =A3B0 B5E3D5FB(为了区别前面的数字,所以我加了空格)3130B5E3D5FB =A3B1A3B0 5E3D5FB 产生了什么Error?你加空格之后,又用这个字串做了什么? ERROR是,我上面帖的代码,为什么不能把30变成A3B0的形式?你加空格之后,又用这个字串做了什么?接着就是显示了!就是因为测试是,这个软件发送的数据在显示后结果没有达到底层的要求,所以才改的! 还是没有说明白你加空格后做了什么(如果加空格后又用它做为16进制进行处理,那肯定不行,因为16进制里没有空格这个数,只有0..9 A..F)这个问题先放在一边不讨论,先讨论你最初的问题吧:试一下:function MyHexStr(X : string) : string;begin case Length(X) of 14 : result := 'A' + Copy(X,1,1) + 'B' + Copy(X,2,1) + Copy(X,3,MaxInt); else result := 'A' + Copy(X,1,1) + 'B' + Copy(X,2,1) + 'A' + Copy(X,3,1) + 'B' + Copy(X,4,1) + Copy(X,5,MaxInt); end;end;procedure TForm1.Button4Click(Sender: TObject);var S, NiYaoDe : string;begin S := '30B5E3D5FB0909';//这个字串,你已经有能力得到,所以你自己做 NiYaoDe := MyHexStr(S); ShowMessage(NiYaoDe); S := '3130B5E3D5FB0909'; NiYaoDe := MyHexStr(S); ShowMessage(NiYaoDe);end; showmessage(带空格的新字串) 这样也出错?你是做什么了?我需要看代码,不然怎么知道你哪里错了 showmessage(带空格的新字串) 这样也出错? 这有出错你是做什么了?我需要看代码,不然怎么知道你哪里错了 我说的是为什么,下面的代码不能实现像A3B0这样的功能? if copy(SendStr,4,1)<> '3' then begin SendStr:=Chr($10) + Chr($54) + Chr($49) + (Chr($A) + Copy(SendStr,1,1)) + Chr($B) + Copy(SendStr,2,1) + copy(SendStr,3,12) + Chr($4D) + Chr($45) + Chr($0D) + Chr($0A); end else if copy(SendStr,4,1)= '3' then begin SendStr:=Chr($10) + Chr($54) + Chr($49) + Chr($A) + Copy(SendStr,1,1) + Chr($B) + Copy(SendStr,2,1)+ Chr($A) + Copy(SendStr,4,1) + Chr($B) + Copy(SendStr,5,1)+copy(SendStr,7,12) + Chr($4D) + Chr($45) + Chr($0D) + Chr($0A); end; 唉,累死。你能不能反馈给我一点信息:“你的代码可以实现!”啊!!要不然我不知道我说的是不是符合你的心意啊!Chr($10) 是什么,你去ASCII码表里查一下,十六进制为10的那个字符,是什么?好象是一个不可见字符!你操作的,一直是一个字符串,所以,在字符串里插入一个字符,就直接用 'A' + Str就行了! 再比如Chr($54) === 'T' !! 是你要的吗?你需要搞明白Chr函数是怎么用的。再就是:'A' + 'B' = 'AB' ----不要告诉我你连这个也不懂 谢谢,这些是头帧:Chr($10) + Chr($54) + Chr($49) 这些是尾帧:Chr($4D) + Chr($45) + Chr($0D) + Chr($0A) Chr($B) 是什么? 我不管你那些是什么,我只是随便挑了几个说明而已。Chr($B) 是你要的 'B' 吗? Chr($B) 是你要的 'B' 吗?是的 这是你代码中的一部分:Chr($A) + Copy(SendStr,1,1) ----你是不是想用它得到 A3 这样啊?前面说了,Chr($A)就是Chr(10),是一个不可见字符! ‘A’是Chr(65)也就是 Chr($41)'A' == Chr(Ord('A')) Chr($B) 是你要的 'B' 吗?是的---------------这就是你错误的原因啊!你没有比较你的代码与我的代码就在这里不同吗?你的是Chr($B) + Copy(SendStr,2,1) 而我的是'B' + Copy(SendStr,2,1) Chr($B) 不等于 'B' ! 呵~ 不客气,讨论到后来,我有点急了。因为问题实际上是一个很简单的问题。你需要复习一下基础。这样说不要生气。$B 是一个十六进立即数,它等于11,而Chr(11)不是字符B,字符B是Chr(66)可以结贴了。 var str:String;begin str:='33ADEF'; insert('B',str,2); insert('A',str,1); ShowMessage(str);end; ZyxIp(绝望中...) 很对不起兄弟,下次一定给你加分 序列号保护模块 具体怎么写一个类? 怎样得到 DBGrid 选中的单元格 的 Left,Top 位置???急 TStream类型如何转换成String类型 更新主键的一个问题 请大家讨论一下ClientSocket和ServerSocket的常连接问题。 谁有HyperSnap-DX V5.40.02 汉化版的注册码 如何屏蔽ctrl+C健以及printscreen健,取消用户的复制功能(锁死这几个健) 问一个关于在DBGrid中实现选择式输入数据的问题 delphi的数据类型转换如何用? DELPHI编写桌面日程安排程序 关于WebBrowser中弹出窗口的问题
0A330BADEF
2、你要什么?把你的代码换成'A' + Copy(SendStr,1,1) + 'B' + Copy(SendStr,2,1)不是吗?
SendStr:String;
B:Byte;
begin
SendStr:=#$33#$AD#$EF; B:=Ord(SendStr[1]); SendStr:=Char((B and $F)or $A0)+Char(((B and $F0) shr 4) or $B0) + Copy(SendStr,2,2);........
是的,因为vkeyj没有分了!
W, W2 : LongWord;
X, X2 : string;
begin
W := 3386863;
X := Format('%x',[W]);//字符串33ADEF
ShowMessage(X);//字符串33ADEF
X2 := 'A' + Copy(X,1,1) + 'B' + Copy(X,2,1) + Copy(X,3,4);//字符串A3B3ADEF
ShowMessage(X2);//字符串A3B3ADEF
W2 := StrToInt('$' + X2);//十六进数A3B3ADEF转为数2746461679
ShowMessage(IntToStr(W2));
end;不明白再说哪里不明白。
31B5E3D5FB0909
32B5E3D5FB0909
33B5E3D5FB0909
34B5E3D5FB0909
35B5E3D5FB0909
36B5E3D5FB0909
37B5E3D5FB0909
38B5E3D5FB0909
39B5E3D5FB0909
3130B5E3D5FB0909
3131B5E3D5FB0909
3132B5E3D5FB0909
3133B5E3D5FB0909
3134B5E3D5FB0909
3135B5E3D5FB0909
3136B5E3D5FB0909
3137B5E3D5FB0909
3138B5E3D5FB0909
3139B5E3D5FB0909
3230B5E3D5FB0909
3231B5E3D5FB0909
3232B5E3D5FB0909
3233B5E3D5FB0909
我要的就是把数字(0 --23)的十六进制变成
3X(X;表示0--9)变成A3BX形式和A3BXA3BX(这是数字10--23所要表达的方式)我是通过判断第三个字符是否等于3来进行的,代码如下:
: if copy(SendStr,4,1)<> '3' then
begin
SendStr:=Chr($10) + Chr($54) + Chr($49) + (Chr($A) + Copy(SendStr,1,1)) + Chr($B) + Copy(SendStr,2,1) + copy(SendStr,3,12) + Chr($4D) + Chr($45) + Chr($0D) + Chr($0A);
end else if copy(SendStr,4,1)= '3' then
begin
SendStr:=Chr($10) + Chr($54) + Chr($49) + Chr($A) + Copy(SendStr,1,1) + Chr($B) + Copy(SendStr,2,1)+ Chr($A) + Copy(SendStr,4,1) + Chr($B) + Copy(SendStr,5,1)+copy(SendStr,7,12) + Chr($4D) + Chr($45) + Chr($0D) + Chr($0A);
end;
但结果不是我想要的得到A3B3ADEF形式,却是0A330BADEF形式,我想知道这是为什么?
W, W2 : LongWord;
X, X2 : string;
begin
W := 3386863;
X := Format('%x',[W]);//字符串33ADEF
ShowMessage(X);//字符串33ADEF
X2 := 'A' + Copy(X,1,1) + 'B' + Copy(X,2,1) + Copy(X,3,4);//字符串A3B3ADEF
ShowMessage(X2);//字符串A3B3ADEF
W2 := StrToInt('$' + X2);//十六进数A3B3ADEF转为数2746461679
ShowMessage(IntToStr(W2));
end;不明白再说哪里不明白。比我多了个IntToStr,其它功能都一样
下面就以此类推!
3130B5E3D5FB0909 ----> ????
30B5E3D5FB =A3B0 B5E3D5FB(为了区别前面的数字,所以我加了空格)3130B5E3D5FB =A3B1A3B0 5E3D5FB
你加空格之后,又用这个字串做了什么?
接着就是显示了!
就是因为测试是,这个软件发送的数据在显示后结果没有达到底层的要求,所以才改的!
begin
case Length(X) of
14 : result := 'A' + Copy(X,1,1) + 'B' + Copy(X,2,1) + Copy(X,3,MaxInt);
else result := 'A' + Copy(X,1,1) + 'B' + Copy(X,2,1) + 'A' + Copy(X,3,1) + 'B' + Copy(X,4,1) + Copy(X,5,MaxInt);
end;
end;procedure TForm1.Button4Click(Sender: TObject);
var
S, NiYaoDe : string;
begin
S := '30B5E3D5FB0909';//这个字串,你已经有能力得到,所以你自己做
NiYaoDe := MyHexStr(S);
ShowMessage(NiYaoDe);
S := '3130B5E3D5FB0909';
NiYaoDe := MyHexStr(S);
ShowMessage(NiYaoDe);
end;
你是做什么了?我需要看代码,不然怎么知道你哪里错了
这有出错
你是做什么了?我需要看代码,不然怎么知道你哪里错了
我说的是为什么,下面的代码不能实现像A3B0这样的功能?
if copy(SendStr,4,1)<> '3' then
begin
SendStr:=Chr($10) + Chr($54) + Chr($49) + (Chr($A) + Copy(SendStr,1,1)) + Chr($B) + Copy(SendStr,2,1) + copy(SendStr,3,12) + Chr($4D) + Chr($45) + Chr($0D) + Chr($0A);
end else if copy(SendStr,4,1)= '3' then
begin
SendStr:=Chr($10) + Chr($54) + Chr($49) + Chr($A) + Copy(SendStr,1,1) + Chr($B) + Copy(SendStr,2,1)+ Chr($A) + Copy(SendStr,4,1) + Chr($B) + Copy(SendStr,5,1)+copy(SendStr,7,12) + Chr($4D) + Chr($45) + Chr($0D) + Chr($0A);
end;
这些是头帧:Chr($10) + Chr($54) + Chr($49)
这些是尾帧:Chr($4D) + Chr($45) + Chr($0D) + Chr($0A)
是的
是的
---------------
这就是你错误的原因啊!你没有比较你的代码与我的代码就在这里不同吗?你的是Chr($B) + Copy(SendStr,2,1)
而我的是'B' + Copy(SendStr,2,1)
str:String;
begin
str:='33ADEF';
insert('B',str,2);
insert('A',str,1);
ShowMessage(str);
end;