VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 849|回复: 5

请教如何将一个整数压缩成指定字节的字符串,并将此字符串还原为此整数?

[复制链接]

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-3-10 09:00:01 | 显示全部楼层 |阅读模式
我目前有两个函数是实现此功能的,但只能处理正整数,负整数会出错,能否帮我增加处理负整数功能呢?谢谢!!!
//将整数转换为协议整数 - 按网络字节顺序的多个字节
Function ConvertInteger (Source,Len : Integer) : String;
Var
    i               : Integer;
Begin
    Result := '';
    For i := 1 To Len Do
    Begin
        Result := Chr (Source And $FF) +Result;
        Source := Source Shr 8;
    End;
End;
//将协议整数(网络字节顺序的多个字节)还原为整数
Function RevertInteger (Source : String) : Integer;
Var
    i               : Integer;
Begin
    Source := Copy (Source,1,4) ;
    Result := 0;i := 1;
    While i<=Length (Source) Do
    Begin
        Result := Result Shl 8+Ord (Source[i]) ;
        Inc (i) ;
    End;
End;
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-6-6 12:30:01 | 显示全部楼层
应该没有问题呀。
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-6-7 21:00:01 | 显示全部楼层
但我测试-2时,转换回来成254了
回复

使用道具 举报

1

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-6-8 12:30:01 | 显示全部楼层
将-2代进去,返回时成254了。测试代码如下:
Procedure TForm1.Button8Click (Sender : TObject) ;
Var
    EE,EE2          : Integer;
    str             : String;
Begin
    EE := -2;
    EE2 := 0;
    str := ConvertInteger (EE,1) ;
    EE2 := RevertInteger (str) ;
    showmessage ('EE2='+IntToStr (EE2) ) ;
End;
回复

使用道具 举报

0

主题

14

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-6-11 18:00:01 | 显示全部楼层
-2和254用二进制表示都一样,所以在前面都加以个标志位,
一个字节,存数的范围是 -128 --128 和 0 -- 255
一个字,  存数的范围是 -32767 --32767 和 0 -- 65535
一次类推,你自己控制就行
回复

使用道具 举报

0

主题

9

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-6-20 11:45:01 | 显示全部楼层
function ConvertInteger(Source, Len: Integer): String;
var
  i: Integer;
begin
  Result := '';
  if Len > SizeOf(Source) then
    Exit;
  for i := 1 to Len do
  begin
    Result := Chr(Source and $FF) + Result;
    Source := Source shr 8;
  end;
end;
//将协议整数(网络字节顺序的多个字节)还原为整数
function RevertInteger(Source: String): Integer;
var
  i, Len: Integer;
  n: Int64;
begin
  Source := Copy(Source, 1, SizeOf(Result));
  Result := 0;
  n := 0;
  i := 1;
  Len := Length(Source);
  while i <= Length(Source) do
  begin
    n := n shl 8 + Ord(Source[i]);
    Inc(i);
  end;
  if n > Power($100, Len) / 2 - 1 then
    n := n - Floor(Power($100, Len));
  Result := n;
end;

//LZ要这个干嘛???这样转换很容易出界的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表