求按位取数操作代码,很容易得分哦!!!!!!!!!!(50分)

  • 主题发起人 主题发起人 philchan
  • 开始时间 开始时间
to GipsCN and lichaogang:
我试了一下你们的程序,好象都不正确呀;
例如:有三个字节(十六进制)为:23 D4 4D 转换后应该为:0F 28 4D
用GipsCN的代码转换后得到的结果为:7F FF 4D
用lichaogang的代码转换后为:03 28 00
请二位再看看代码好吗?
 
sorry,定义变量是有误,应该是dword类型。

procedure GetNumbers(const aByteArray:TByteArray;var RByteArray:TByteArray);
var
aDWord,tmpdWord:dword;
 
你先把十六进制的数转换成二进制数,用8位字符串表示。
然后你想怎么取这个数的哪几位,取完后,组成你想要的数的二进制8位字符串,
然后再将其转换成你要的数。
下面是我以前做的程序,说起来不怕你笑话,那时我还不知到delphi里有copy函数,所以自己写了一个mid函数,功能差不多。下面例子不是你要的,但是你可以做成你要的函数。
如果有需要交流的话:qq:63003960
function HtoS(i:integer):string; // 将1---15的10进制整数转换为16进制数据字符
begin
case i of
0:HtoS:='0';
1:HtoS:='1';
2:HtoS:='2';
3:HtoS:='3';
4:HtoS:='4';
5:HtoS:='5';
6:HtoS:='6';
7:HtoS:='7';
8:HtoS:='8';
9:HtoS:='9';
10:HtoS:='A';
11:HtoS:='B';
12:HtoS:='C';
13:HtoS:='D';
14:HtoS:='E';
15:HtoS:='F';
end
end;
function mid(s:string;a,b:integer):string;
var i,l:integer;
str:string;
begin
l:=length(s);
str:='';
if (b+a-1)<=l
then
for i:=a to (a+b-1) do
str:=str+s;
mid:=str;
end;
function SHtoD(s:string):integer;// 将1位16进制数据字符转换为1---15的10进制整数
var f:boolean;
begin
f:=false;
if s='A' then BEGIN SHtoD:=10; F:=True; end;
if s='B' then BEGIN SHtoD:=11; F:=True; end;
if s='C' then BEGIN SHtoD:=12; F:=True; end;
if s='D' then BEGIN SHtoD:=13; F:=True; end;
if s='E' then BEGIN SHtoD:=14; F:=True; end;
if s='F' then BEGIN SHtoD:=15; F:=True; end;
if f=false then SHtoD:=strtoint(s);

end;
function DtoH(i:integer):string; //将10进制整数转换成4位16进制字符串,低位在前
var temp163,temp162,h1,h2,h3,h4:integer;
begin
temp163:=16*16*16;
temp162:=16*16;
h1:=i div temp163;
h2:=(i-temp163*h1) div temp162;
h3:=(i-(temp163*h1+temp162*h2)) div 16;
h4:=i mod 16;
DtoH:=HtoS(h1)+HtoS(h2)+HtoS(h3)+HtoS(h4);
end;
function HtoD(s:string):integer;//将4位16进制数字符串转换为10进制整数 ,高位在后,低位在前
var x,l:integer;
begin
l:=Length(s);
x:=0;
case l of
1: x:=x+SHtoD(s[1]);
2: begin
x:=x+SHtoD(s[1])*16;
x:=x+SHtoD(s[2]);
end;
3: begin
x:=x+SHtoD(s[1])*16*16;
x:=x+SHtoD(s[2])*16;
x:=x+SHtoD(s[3]);
end;
4: begin
x:=SHtoD(s[1])*16*16*16;
x:=x+SHtoD(s[2])*16*16;
x:=x+SHtoD(s[3])*16;
x:=x+SHtoD(s[4]);
end;
else x:=0;//showmessage('只能处理4位16进制数字符串') ;
end;
HtoD:=x;
end;
Function DtoS(x:integer):string; //将10进制数转换为4位高低互换的10进制字符串,
//由于PLC内部是将16进制的数作10进制数处理,
//所以直接将这10进制字符串送到PLC。
var s,strtemp:string;
leng,i:integer;
begin
s:=inttostr(x);
leng:=length(s);
strtemp:='';
for i:=1 to 4-leng do
strtemp:=strtemp+'0';
s:=mid((strtemp+s),3,2)+mid((strtemp+s),1,2);
DtoS:=s;
end;

 
to lichaogang: 改为DWORD后,结果是正确的,谢谢。
问题已经解决了,我用了一个比较笨的方法。
 
多人接受答案了。
 
后退
顶部