字串处理的问题,应该不算难(100分)

  • 主题发起人 主题发起人 m8858
  • 开始时间 开始时间
M

m8858

Unregistered / Unconfirmed
GUEST, unregistred user!
有类似这样的字串 B8 B8 B8 BB BB BB BA BA BA
如何将以每组字符(两个数)后面的字符为运算条件
如果后面的字符等于0, 2, 4, 6 则将小组字符减 $77;
如果后面的字符等于1, 3, 5, 7 则将小组字符减 $79;
如果后面的字符等于8, A, C, E 则将小组字符减 $87;
如果后面的字符等于9, B, D, F 则将小组字符减 $89;
如果后面的字符等于其他,则退出
之后将全部字串显示出来 该怎么写?
 
B8 B8 B8 BB BB BB BA BA BA ----------这里面哪个可以等于0,2,4,6,8...1,3,5,7...等
 
$ 在Delphi是16进制

我想你是不是希望进行16进制的计算

可以看看这个帖子
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2290273
HexToInt的实现&速度大比拼
 
IntToHex($B8 - $87, 2)
 
单个运算我到是理解,但是我问的是整串字符是应该怎么处理啊,
 
循环判断一下相减应该是可以了
 
var
a,b,m:integer;
c,d,s,key:string;//定义字符串

begin
key:='B';
s:=EDIT1.Text;// 给字符串赋值
while pos(key,s)>0 do
begin
a:=pos(key,s);
d:=copy(s,1,a+1);//取每组字符串
if (copy(d,2,1)='0') or (copy(d,2,1)='2') or (copy(d,2,1)='4') or (copy(d,2,1)='6')
then
begin
m:=ord(d[1])-$77;//这里,到底是$B8-$77还是$8-$77?
memo1.lines.add(inttostr(m));
end;
if (copy(d,2,1)='1') or (copy(d,2,1)='3') or (copy(d,2,1)='5') or (copy(d,2,1)='7')
then
begin
m:=ord(d[1])-$79;//这里,到底是$B8-$77还是$8-$79?
memo1.lines.add(inttostr(m));
end;
if (copy(d,2,1)='8') or (copy(d,2,1)='A') or (copy(d,2,1)='C') or (copy(d,2,1)='E')
then
begin
m:=ord(d[1])-$87;//
memo1.lines.add(inttostr(m));
end;
if (copy(d,2,1)='9') or (copy(d,2,1)='B') or (copy(d,2,1)='D') or (copy(d,2,1)='F')
then
begin
m:=ord(d[1])-$89;//
memo1.lines.add(inttostr(m));
end;
S:=Rightstr(S,length(S)-3);
end;
end;
不过跟你算的结果有出入,能说明下B8,BB..的值是多少?
 
function StrDecode(const ASource: string): string;
var
P: PByte;
L: Integer;
begin
L := Length(ASource);
Result := Copy(ASource, 1, L);
P := PByte(Result);
while L > 0 do
begin
case P^ and not $F0 of
$0, $2, $4, $6:
Dec(P^, $77);
$1, $3, $5, $7:
Dec(P^, $79);
$8, $A, $C, $E:
Dec(P^, $87);
$9, $B, $D, $F:
Dec(P^, $89);
end;
Inc(P);
Dec(L);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := StrDecode(#$B8#$BB#$BA);
end;
 
屏蔽一个16进制的第二位就可以完成的事,搞那么复杂。。。

就一句话的处理:V and not $F0
 
B8 B8 B8 BB BB BB BA BA BA
 
function HexStringDecode(const S: string): string;

function GetByte(const V: Char): Byte;
begin
case V of
'a'..'f':
Result := Ord(V) - Ord('a') + 10;
'A'..'F':
Result := Ord(V) - Ord('A') + 10;
else
Result := Ord(V) - Ord('0');
end;
end;

var
R: PByte;
P: PChar;
I, Len: Integer;
begin
Len := Length(S) div 2;
Result := StringOfChar(#0, Len);
P := PChar(S);
R := PByte(Result);
for I := 1 to Len do
begin
R^ := GetByte(P[0]) * 16 + GetByte(P[1]);
Inc(R);
Inc(P, 2);
end;
end;

Caption := HexStringDecode('B8B8B8BBBBBBBABABA')
 
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := StrDecode(HexStringDecode('B8B8B8BBBBBBBABABA'));
end;

???????
 
没有乱码 是我的错! 大侠 谢谢你!!
下面这个也是你应该得到的

http://www.delphibbs.com/delphibbs/dispq.asp?lid=3627182
 
不用客气,举手之劳
 
后退
顶部