5

我想创建轻对象数据包以在客户端和服务器应用程序之间传递。

这是一个非常简单的任务,我可以只用一个字节来控制,所以一个字节中的每一位都会有不同的含义,

仅使用位

0 = False 
1 = True

我现在需要的东西:

1 - Loaded from database 
2 - Persisted
3 - Changed
4 - Marked to Delete
5 -
6 - 
7 - Null Value 
8 - Read Only


1) How do I use bit operators in Delphi to check each bit value? 
2) How do I set the bit Values?

解决方案

在所有帮助之后,我将使用下一组

  TStateType = (
    stLoaded    = 0,   // loaded from persistance
    stNative    = 2,   // value loaded and converted to native type
    stPersisted = 3,   // saved
    stChanged   = 4,   // object or member changed
    stToDelete  = 5,   // marked to delete
    stReadOnly  = 6,   // read only object, will not allow changes
    stNull      = 7    // value is null
  );
  TState = Set of TStateType;

对于流 -> 持久性,这将是要使用的记录:

  TDataPackage = record
    Data: TBytes;
    TypeInfo: TMetaInfo;
    State: Byte;
    Instance: TBuffer;
  end;

谢谢大家,所有的答案和评论。

4

3 回答 3

7

我真的会为此使用一套。但是,我看到你真的想要一个字节。在任何地方都使用集合,然后最后类型转换为一个字节。

该解决方案将需要更少的输入,支持标准的 delphi 运算符,并且正如 Barry Kelly 所指出的那样,确实没有性能损失。

procedure Test;
type
  TSetValues = (
    TSetValue1   = 0,
    TSetValue2   = 1,
    TSetValue4   = 2,
    TSetValue8   = 3,
    TSetValue16  = 4,
    TSetValue32  = 5,
    TSetValue64  = 6,
    TSetValue128 = 7
  );

  TMySet = set of TSetValues;
var
  myValue: byte;
  mySet: TMySet;
begin
  mySet := [TSetValue2, TSetValue16, TSetValue128];
  myValue := byte(mySet);
  ShowMessage(IntToStr(myValue)); // <-- shows 146
end;
于 2009-02-05T17:08:15.540 回答
6

我会为此使用一组:

type
    TMyDatum = (mdLoaded, mdPersisted, mdChanged, mdMarkedToDelete, ...);
    TMyData = set of TMyDatum;

var
  Foo: TMyData;
begin 
  Foo := [mdLoaded, mdChanged];
  if (mdPersisted in Foo) then ...

这些是作为整数实现的,因此您可以轻松地传递它们。而且我发现代码比位运算符更具可读性。

于 2009-02-05T16:46:01.670 回答
1

本页介绍 Delphi 运算符,包括位运算符。

听起来您需要使用 and 运算符。例如:

const
  LOADED_FROM_DATABASE = 1;
  PERSISTED = 2;
  CHANGED = 4;
  // etc...

//...

if (bitFlags and LOADED_FROM_DATABASE) <> 0 then
begin
  // handle LOADED FROM DATABASE
end;

if (bitFlags and PERSISTED) <> 0 then
begin
  // handle PERSISTED
end;

// etc...

为了设置标志,您可以使用 OR:

bitFlags := LOADED_FROM_DATABASE or PERSISTED or CHANGED;
于 2009-02-05T16:36:08.927 回答