比如说有一串十六进制的字符(33ADEF),我用下面的代码想实现的结果是:
A3B3ADEF,但结果却是0A330BADEF
Chr($A) + Copy(SendStr,1,1) + Chr($B) + Copy(SendStr,2,1)
请问导致这个结果的原因是什么??

解决方案 »

  1.   

    呵,你要的不就是个字符串吗?'A' + Copy(SendStr,1,1) + 'B' + Copy(SendStr,2,1) + 'ADEF'
      

  2.   

    我要的是这个字符串,但结果不对,我要的结果是:A3B3ADEF但这段代码给出的结果是:
    0A330BADEF
      

  3.   

    1、vkeyj(楼上)  ==  shattered (楼主)  ??????
    2、你要什么?把你的代码换成'A' + Copy(SendStr,1,1) + 'B' + Copy(SendStr,2,1)不是吗?
      

  4.   

    看看这个是不是你想要的: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);........
      

  5.   

    lihuasoft(学习低调做人) 
    是的,因为vkeyj没有分了!
      

  6.   

    我开玩笑的。担心不是楼主在问。抱歉了。你的33ADEF是字符串吧,然后你想得到A3B3ADEF这样一个字符串是吧。把你的目的详细说明一下,我帮你!
      

  7.   

    这样吧,你先研究一下我刚才给你写的这个代码: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;不明白再说哪里不明白。
      

  8.   

    我要把"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形式,我想知道这是为什么?
      

  9.   

    请先举例说明一下30B5E3D5FB0909是什么数据(说明一下类型)的十六进制字符串形式
      

  10.   

    这样吧,你先研究一下我刚才给你写的这个代码: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,其它功能都一样
      

  11.   

    30B5E3D5FB(那个0909是空格)是"0点整"的十六进制字符串形式
    下面就以此类推!
      

  12.   

    哦,那是因为我不知你要的是什么类型的数据,所以多加上的一层转换。这样吧:你要的就是把字串按你的规则转换为新的字串,是吧。你把30B5E3D5FB0909和3130B5E3D5FB0909这两个转换后的希望结果写出来,我帮你写一个小函数。
      

  13.   

    30B5E3D5FB0909  ---->  ????
    3130B5E3D5FB0909  ----> ????
      

  14.   

    请问---lihuasoft(学习低调做人) ,产生这个ERRO的原因是什么?
    30B5E3D5FB =A3B0 B5E3D5FB(为了区别前面的数字,所以我加了空格)3130B5E3D5FB =A3B1A3B0 5E3D5FB
      

  15.   

    产生了什么Error?你加空格之后,又用这个字串做了什么?
      

  16.   

    ERROR是,我上面帖的代码,为什么不能把30变成A3B0的形式?
    你加空格之后,又用这个字串做了什么?
    接着就是显示了!
    就是因为测试是,这个软件发送的数据在显示后结果没有达到底层的要求,所以才改的!
      

  17.   

    还是没有说明白你加空格后做了什么(如果加空格后又用它做为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;
      

  18.   

    showmessage(带空格的新字串)  这样也出错?
    你是做什么了?我需要看代码,不然怎么知道你哪里错了
      

  19.   

    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;
      

  20.   

    唉,累死。你能不能反馈给我一点信息:“你的代码可以实现!”啊!!要不然我不知道我说的是不是符合你的心意啊!Chr($10) 是什么,你去ASCII码表里查一下,十六进制为10的那个字符,是什么?好象是一个不可见字符!你操作的,一直是一个字符串,所以,在字符串里插入一个字符,就直接用 'A' + Str就行了!
      

  21.   

    再比如Chr($54) === 'T' !!  是你要的吗?你需要搞明白Chr函数是怎么用的。再就是:'A' + 'B' = 'AB'  ----不要告诉我你连这个也不懂
      

  22.   

    谢谢,
    这些是头帧:Chr($10) + Chr($54) + Chr($49) 
    这些是尾帧:Chr($4D) + Chr($45) + Chr($0D) + Chr($0A)
      

  23.   

    Chr($B) 是什么?  我不管你那些是什么,我只是随便挑了几个说明而已。Chr($B) 是你要的 'B' 吗?
      

  24.   

    Chr($B) 是你要的 'B' 吗?
    是的
      

  25.   

    这是你代码中的一部分:Chr($A) + Copy(SendStr,1,1)    ----你是不是想用它得到 A3 这样啊?前面说了,Chr($A)就是Chr(10),是一个不可见字符!  ‘A’是Chr(65)也就是 Chr($41)'A' == Chr(Ord('A'))
      

  26.   

    Chr($B) 是你要的 'B' 吗?
    是的
    ---------------
    这就是你错误的原因啊!你没有比较你的代码与我的代码就在这里不同吗?你的是Chr($B) + Copy(SendStr,2,1)    
    而我的是'B' + Copy(SendStr,2,1)
      

  27.   

    Chr($B) 不等于 'B' !
      

  28.   

    呵~ 不客气,讨论到后来,我有点急了。因为问题实际上是一个很简单的问题。你需要复习一下基础。这样说不要生气。$B 是一个十六进立即数,它等于11,而Chr(11)不是字符B,字符B是Chr(66)可以结贴了。
      

  29.   

    var
      str:String;
    begin
      str:='33ADEF';
      insert('B',str,2);
      insert('A',str,1);
      ShowMessage(str);
    end;
      

  30.   

    ZyxIp(绝望中...) 很对不起兄弟,下次一定给你加分