Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我们能把6字节整数编码成4字节整数吗?_C - Fatal编程技术网

C 我们能把6字节整数编码成4字节整数吗?

C 我们能把6字节整数编码成4字节整数吗?,c,C,我的应用程序(C代码)从某个外部模块接收一个4字节的整数,并在整个应用程序中进一步使用它。现在,这个模块向我发送一个6字节的整数,但我无法更改我的应用程序,我想用某种方法将收到的6字节整数编码为4字节,这样我的应用程序就可以无缝地工作。这是极不可能的 无论如何,您需要修改应用程序以保存6字节整数。我知道变化可能很大。但是使用定制的内置数据类型别名(带有宏或typedef)将有助于以最少的代码更改处理此类情况。至少功能原型不会改变 旧代码 typedef int MY_INT; func(MY_I

我的应用程序(C代码)从某个外部模块接收一个4字节的整数,并在整个应用程序中进一步使用它。现在,这个模块向我发送一个6字节的整数,但我无法更改我的应用程序,我想用某种方法将收到的6字节整数编码为4字节,这样我的应用程序就可以无缝地工作。

这是极不可能的

无论如何,您需要修改应用程序以保存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
}

您当然可以将一个6字节的数字编码为4字节,但从数学上讲,不可能在所有情况下恢复原始数字

如果6字节输入有232个可能的值(意味着绝大多数可能的6字节输入永远不会出现),那么您可以这样做。如果您将要得到的232正好可以用32位表示,那么问题几乎是微不足道的,尽管我们需要更多关于数字如何表示的信息。(例如,高阶2字节是否总是零?)

我在这里假设一个“字节”是8位;这是这个词最常见的意思,但它不是通用的


如果您有一个相当现代的C编译器,那么您可以使用类型
long
,它保证至少是64位(8字节)。你说你不能改变你的申请,但那没有意义;更改应用程序是实现任何目标的唯一方法。如果您的意思是无法更改应用程序的某些属性,那么您必须再次向我们提供更多信息。

如果不冒丢失某些信息的风险,则不可能这样做。对于6字节整数,可能值的数量比4字节整数支持的数量多。这意味着,对于每一个4字节的整数,您可以构造一个等效的6字节整数;但对于每个6字节的整数,不可能构造一个4字节的整数

typedef long long MY_INT;
func(MY_INT a)
{
    //doing operation on a
}

对于6个字节,上限为2.8147498e+14个可能的字节组合。对于4个字节,可能的字节组合上限为4294967296。从6个字节移动到4个字节,第4294967297个及以上的组合将不得不丢弃。通过放弃这些组合,它将不是一个“完美”的互操作性,因为有些输入在4字节系统中没有等价物。

您所问的基本意思是(通过归纳法),您可以将任何内容压缩为一个位。如果整数太大,无法用32位表示,该怎么办?如果您知道它将介于
-2^31
2^31-1
之间,只需使用强制转换。忽略两个最低顺序的字节可能是一个选项,但肯定没有足够的上下文来说明。计数定理指出,您不能用少于未压缩数据所占位数的位数对任意数据进行编码。现在,如果你有一个减少功能,它可以删除足够多的冗余信息,从而将包含最多4字节熵的数据减少到4字节。。。如果它包含更多的内容,也许您可以将其用作包含实际数据的边表的索引…@sandeparora:实际上是否有216种可能的标识符类型和232种可能的标识符索引?请更新您的问题,提供更多有关您需求的信息;你的问题目前无法得到有意义的回答。你忘记了这两个问题都是唯一的或专用的。也许可以提及使用4字节句柄的可能性,因为限制似乎只存在于应用程序中…@重复数据消除:我不知道你所说的“4字节句柄”是什么意思。他说“想用某种方式将接收到的6字节数据编码为4字节,以便我的应用程序能够无缝工作”,因此它可能仅用于内部转发。因此,使用表示实际数据的句柄可能是可行的…@重复数据消除程序:请随意发布答案。请阅读。