2010-04-16 78 views
0

我设法通过读取IPv4方法来获得unsigned long int八位字节表示(BE),并且我设法读取了有符号整数如何使用MSB作为符号指示符,这使得00 00 00 00为0,而7F FF FF FF是2147483647.将签名的long int(32bit)存储为4个八位字节?

但我不能管理如何做同样的签名长整数?

#include <stdio.h> 
#include <string.h> 

int main (void) 
{ 
    unsigned long int intu32; 
    unsigned char octets[4]; 

    intu32 = 255; 

    octets[3] = (intu32) & 255; 
    octets[2] = (intu32 >> 8) & 255; 
    octets[1] = (intu32 >> 16) & 255; 
    octets[0] = (intu32 >> 24) & 255; 
    printf("(%d)(%d)(%d)(%d)\n", octets[0], octets[1], octets[2], octets[3]); 

    intu32 = (octets[0] << 24) | (octets[1] << 16) | (octets[2] << 8) | octets[3]; 
    printf("intu32:%lu\n", intu32); 

    return 0; 
} 

由于提前, Doori酒吧

+0

你会得到什么输出?你在期待什么? – Vicky 2010-04-16 10:31:31

+0

嘿Vicky,感谢您的快速响应。样本的输出对于有符号和无符号都是准确的,显然我的印象是这种方法只对无符号的32位整数有效,而展开解释说同样的方法对于有符号和无符号都是相关的。 – 2010-04-16 13:09:03

回答

2

没有区别。您始终可以对带符号整数进行序列化/反序列化,就好像它们是无符号的,差别仅在于对位的解释,而不在于位本身。

当然,只有当您知道无符号和有符号整数的大小相同时,这才成立,以避免丢失任何位。

此外,你需要小心(因为你是)没有中间阶段做任何计划外的符号扩展或类似的,个别字节的使用unsigned char是一个好主意。

+0

非常感谢您的回答。我想我一直在读太多关于有符号和无符号的区别,以及使用少一个代表符号的想法,这使我相信有一些东西需要进一步调整以保留有符号表示。 因此,我将使用完全相同的方法为无符号和有符号。 Doori酒吧 – 2010-04-16 13:03:48

0

您可能会对使用二进制补码编码进行负值编码是常见做法(并在ix86处理器中应用)感到困惑。这意味着4字节-1的十六进制符号是0xffffffff。使用此编码的原因是,通过考虑自动溢出添加2 0x00000002到-1将产生正确的结果(0x00000001)。

+0

感谢您的解释,我想我们可以同意我对整个主题感到困惑:) – 2010-04-16 13:17:01

0

你想要这样的东西吗?如果你能提供你拥有的和你想得到的东西,这将会是有益的(就像维基所问)。

#include <stdio.h> 
#include <string.h> 

int main (void) 
{ 
    union{ 
     long int intu32; 
     char octets[4]; 
    } u; 
    u.intu32 = 255; 

    printf("(%d)(%d)(%d)(%d)\n", (int) u.octets[3], (int) u.octets[2], (int) u.octets[1], (int) u.octets[0]); 

    printf("intu32:%lu\n", u.intu32); 

    return 0; 
} 
+0

正如展开说明的,似乎我给出的示例对签名和未签名的32位整数都是完全有效的。问候你的样品 - 是不是受机器的排序影响? (如果数据将被存储在LE机器下,并且被BE机器提取,我的样本不会受到影响?) – 2010-04-16 13:15:12

+0

也许。对于整数,那么你是对的(但我没有个人经验)。但是,这也取决于IP地址如何被压缩到首要的位置。如果来自IP帧的IP地址只是被结构中的整数访问,那么我认为联合是处理它的便携式方式。顺便说一句,你可能注意到我旋转了八位字节索引。 – philcolbourn 2010-04-17 05:48:16

+0

这是一篇关于这个问题的好文章。 http://www.ibm.com/developerworks/aix/library/au-endianc/index.html?ca=drs- – philcolbourn 2010-04-17 06:02:18

相关问题