我的应用程序(C代码)从某个外部模块接收一个4字节整数,并在整个应用程序中进一步使用它。现在这个模块给我发送了一个6字节的整数,但是我不能改变我的应用程序,并希望有一些方法将接收到的6字节编码为4字节,这样我的应用程序就可以无缝地工作了。
答案 0 :(得分:2)
你当然可以用4字节编码一个6字节的数字,但在数学上不可能在所有情况下恢复原始数字。
如果6字节输入具有2个 32 可能的值(意味着绝大多数可能的6字节输入将永远不会出现),那么您可以这样做。如果2 32 你将会以32位表示,那么问题几乎是微不足道的,尽管我们需要更多关于数字如何表示的信息。 (例如,高位2字节总是为零?)如果有2个 32 或更少的可能输入但是它们分散在48位数的范围内,那么你需要做一些非平凡的编码 - 在这种情况下,我们需要一个 lot 比你给我们更多的信息。
我假设“字节”是8位;这是该术语最常见的含义,但并不普遍。
如果你有一个相当现代的C编译器,那么你可以使用类型long long
,它保证至少是64位(8字节)。你说你不能改变你的应用程序,但这没有意义;改变你的应用程序是你能够完成任何事情的唯一方法。如果您的意思是无法更改应用程序的某些属性,那么您将不得不向我们提供更多信息。
答案 1 :(得分:0)
非常不可能。
无论如何,您需要修改应用程序以保存6字节整数。我知道迁移的变化是巨大的。但是使用自定义的内置数据类型别名(使用宏或typedef)将有助于在最少的代码更改的情况下处理这些情况。至少功能原型不会改变。
旧代码
typedef int MY_INT;
func(MY_INT a)
{
//doing operation on a
}
此代码需要修改如下以保存6字节整数。
typedef long long MY_INT;
func(MY_INT a)
{
//doing operation on a
}
答案 2 :(得分:0)
如果没有丢失某些信息的风险,则无法这样做。使用6字节整数时,可能的值大于4字节整数所支持的值。这意味着对于每4字节整数,您可以构造一个等效的6字节整数;但是对于每6字节整数,不可能构造一个4字节的整数。
对于6个字节,您的上限为2.8147498e + 14个可能的字节组合。对于4个字节,您有一个可能的字节组合的上限为4294967296。从6个字节移动到4个字节,必须丢弃4294967297和以上的组合。通过丢弃这些组合,它将不会是一个完美的"互操作性,因为一些输入在4字节系统中不具备等价物。