1

它相当复杂,所以我需要解释一下:

我有一个结构,这个结构用了很长时间,用来读/写二进制文件。所以不能在这个结构中添加新的或删除任何字段。但是当我创建这个结构时,我在这个结构中放了一个备用,以便在功能中重用。现在,这个结构是:

struct Entry {
 int a;
 int b;
 ....
 char spare[4];
};

现在我的结构中有 4 个字节。我需要根据以下 3 个信息创建 ID 条目:

  • 时间:(月份和年份,年份格式为YY,月份格式为MM)。

  • Code:入口代码,包含3个字符,例如:ABC。

  • Values:入口的值,为浮点型,包括整数和小数部分的4位数字。例如:1.21、40.14 或 12.3。

基于以上 3 条信息,如何创建 1 个包含 4 个字节的 ID 条目。非常感谢。

注意:我有办法:

  • 时间:假设 12/99 编码为 12*100+99 = 1299

  • 代码:假设 ABC 编码为 'A' + 'B' + 'C' = 65 + 66 + 67 = 198。

  • 值:假设 40.25 编码为 40.14*100 = 4014。

之后,我将 3 个数字 1299、198、4014 编码为:

ID_Entry = (1299 * 10^7) + (198*10^4) + 4014 = 1299 198 4014 = 12.991.984.014。但是这个 ID_Entry 太大而不能包含在 4 字节备用中

你有什么办法或改进我的办法,请告诉我,帮助我,非常感谢。

P/S:因此创建 ID 因此不能重复,在同一时间(月 + 年)代码和值不重复,如果 ts 不同时间,代码和值可以重复。

4

3 回答 3

3

您可以将数据编码为位域。

例如月份和年份:月份是 0-11,所以你需要 4 位。一年允许说 7 位(您可以添加一个常数,例如 2000 来获得实际年份)。

那是 11 位

3字符代码:如果代码只是AZ,您可以在5位(3 * 5 = 15)中做每一个

= 26 位,但只留下 6 位用于 id,这不足以处理您想要的范围。

字节中的位如下所示:

MMMM_YYYY  YYYA_AAAA  BBBB_BCCC  CCII_IIII

Where M=Month, Y=Year, A=Code1, B=Code2, C=Code3, I=Id
于 2012-11-15T23:54:35.347 回答
2

您正试图在 10 磅的袋子中装入 20 磅的土豆。

考虑 ID 的所有可能值,假设 26 个字母、100 年的月份以及从 00.01 到 99.99 的值。有26*26*26 * 1200 * 10000可能的值,或 210,912,000,000 个不同的组合。由于 32 位 int 只有 4,294,967,296 个不同的值,因此无论您选择哪种编码,您都不可能代表所有值。

可以做的是减少其中一些数字。也许是三位数而不是四位数?也许是字母 A 到 M 而不是 A 到 Z?也许只记录月份而不是年份和月份?

例如,如果将值限制为两位数,则可以这样编码:

id = (char1 - 'A');
id = id * 26 + (char2 - 'A');
id = id * 26 + (char3 - 'A');
id = id * 26 + (year * 100 + month);
id = id * 1200 + (int)(value);

2,109,120,000 种可能的组合。超过一整点备用!

于 2012-11-15T23:58:11.853 回答
0
  1. 您的结构有超过 4 个字节。

  2. 一个浮点数有 4 个字节,一个字符有 1 个字节,您的时间格式可以存储在 2 个字节中,也可以是 1 个字节。

如果我理解你正确的话,你自己算算你至少有 21 个字节的信息要存储在 4 个字节中而不会发生冲突。这不可能!

在某些情况下,如果您可以限制输入数据,您可以优化大小,例如,只有 16 个不同的字符是可能的,或者只允许 0 到 1 之间的浮点数,但仍然无法从您编写的内容中实现您想要实现的目标。

于 2012-11-15T23:52:17.787 回答