通过使用此规则确保严格的 BC,您将拥有 FC:
新版本必须保持以前版本已知的字段布局。
如果你能遵守规则,你将自动拥有 BC 和 FC。因此,使用该规则,您只能通过将新字段附加到现有布局来添加它们。
让我用一个例子来解释。假设您需要为版本 2 添加这些字段:
Field-5 (1-bit)
Field-6 (7-bits)
请记住规则,新字段只能附加到现有布局。所以,这是版本 2 的消息布局:
Version-Field,Field-1,Field-3,Field-2,Field-4,Field-5,Field-6
因为版本 1 已知的布局是完整的,所以您的版本 1 代码可以读取任何版本的消息(伪代码):
function readMessageVersion1(byte[] input) {
var msg = {};
msg.version = input[0];
msg.field1 = input[1] & 0x0f;
msg.field3 = input[1] >> 4 & 0x0f;
msg.field2 = input[2] & 0x3f;
msg.field4 = input[2] >> 6 & 0x03;
return msg;
}
版本 1 不需要检查版本字段,因为已知布局是无条件的。但是,版本 2 和所有其他版本都需要检查版本字段。假设我们使用值 2 来表示版本 2,这将执行(伪代码):
function readMessageVersion2(byte[] input) {
var msg = readMessageVersion1(input);
//check version field
if (msg.version < 2) return msg;
msg.field5 = input[3] & 0x01;
msg.field6 = input[3] >> 1 & 0x7f;
return msg;
}
代码中最重要的部分是它重用了以前版本中的代码,并进行了以下检查:
if (msg.version < 2) return msg;
版本 3 的代码可以像这样简单地遵循版本 2:
function readMessageVersion3(byte[] input) {
var msg = readMessageVersion2(input);
//check version field
if (msg.version < 3) return msg;
// read the input bytes here
return msg;
}
将其视为未来版本的模板。通过遵循规则和示例,任何版本的协议都可以读取来自任何版本的消息,只需 1 字节开销。