C将大整数转换为二进制

C将大整数转换为二进制,c,linux,netfilter,C,Linux,Netfilter,我将IP地址放入一个框中,例如21211328 我想把这个整数转换成二进制形式 我现在遇到的问题是,根据示例,我的函数会吐出,-62674752 这显然是错误的,因为它不可能是负数,也不是二进制的 我正在使用的函数如下所示: int toBinary(int decimalNo){ if (decimalNo == 0) return 0; if (decimalNo == 1) return 1; /* optional */

我将IP地址放入一个框中,例如21211328

我想把这个整数转换成二进制形式

我现在遇到的问题是,根据示例,我的函数会吐出,-62674752

这显然是错误的,因为它不可能是负数,也不是二进制的

我正在使用的函数如下所示:

int toBinary(int decimalNo){
    if (decimalNo == 0) return 0;
    if (decimalNo == 1) return 1;                       /* optional */
    return (decimalNo % 2) + 10 * toBinary(decimalNo / 2);
}
我使用它的方式如下:

int num_converted = toBinary(iph->saddr); // convert it to binary
printk(KERN_INFO "BSADDR: %d", num_converted); // print the binary conversion to kernel for debugging
if ((num_converted & mask_array) == masked_sub){
        return NF_DROP;
}
这将返回内核日志中不正确的输出,如上所示

iph->saddr返回21211328,int num_converted=toBinary(iph->saddr);返回-62674752。

尝试以下操作:

#include <stdio.h>

char *getBin( unsigned long val) {
    static char buf[33];
    int i;

    buf[32]='\0';
    for(i=31; i>=0; i--){
        buf[i] = val & 1?'1':'0';
        val/=2;
    }
    return buf;
}

int main()
{
    unsigned long ip=0x80e2d301;    
    printf( " ip:%08lx, bin:%sB\n", (unsigned long)ip, getBin(ip) );
    return 0;
}
#包括
char*getBin(无符号长val){
静态字符buf[33];
int i;
buf[32]='\0';
对于(i=31;i>=0;i--){
buf[i]=val&1?'1':'0';
val/=2;
}
返回buf;
}
int main()
{
无符号长ip=0x80e2d301;
printf(“ip:%08lx,bin:%sB\n”,(无符号长)ip,getBin(ip));
返回0;
}
试试这个:

#include <stdio.h>

char *getBin( unsigned long val) {
    static char buf[33];
    int i;

    buf[32]='\0';
    for(i=31; i>=0; i--){
        buf[i] = val & 1?'1':'0';
        val/=2;
    }
    return buf;
}

int main()
{
    unsigned long ip=0x80e2d301;    
    printf( " ip:%08lx, bin:%sB\n", (unsigned long)ip, getBin(ip) );
    return 0;
}
#包括
char*getBin(无符号长val){
静态字符buf[33];
int i;
buf[32]='\0';
对于(i=31;i>=0;i--){
buf[i]=val&1?'1':'0';
val/=2;
}
返回buf;
}
int main()
{
无符号长ip=0x80e2d301;
printf(“ip:%08lx,bin:%sB\n”,(无符号长)ip,getBin(ip));
返回0;
}

首先,ip地址通常表示为(供人类使用)单个字节的四分之一(四个数字按网络字节顺序由点分隔),而不是二进制序列

< P>地址(21211328)表示地址<代码> 1.67.168192<代码>(我猜这是错误的表示---你需要考虑所有IP地址都是在网络字节顺序中,最有意义的字节第一——地址<代码> 192.16867.1)

如果要成功地解码IP地址,首先要考虑的是,如果机器将以正确的字节数对待它,或者必须转换字节才能将其解释为数字。地址
192.168.67.1
的正确整数(十进制)应为
3232252673
。此数字不能表示为有符号整数,因为它有最重要的位,所以它将表示为负数

要解码IP地址,首先必须使用
ntohl(3)
函数将从套接字接口获得的数字转换为主机字节顺序(endianness)。一旦地址按主机字节顺序排列,就必须将数字转换为以256为基数。这非常简单,您可以使用以下代码片段来完成:

unsigned long ip_address = ntohl(server_address.sin_addr.s_addr);
int i;

for (i = 24; i >= 0; i -= 8) {
    if (i < 24) printf("."); /* print the dot between the numbers */
    printf("%d",
        (ip_address >> i) & 0xff);
}
这次的掩码是
0x01
,它只屏蔽数字的最小有效位

最后,我编写了一个完整的程序来说明两种解码方式,另外还展示了
ntohl(3)
函数的使用:

ipaddr.c 以虚线小数形式查看输出,以及

$ cc -o ipaddr -DDOTTED_DECIMAL=0 ipaddr.c
查看二进制数字的输出


(我包括行号,因此可以使用代码引用,并对代码进行注释,这样您就可以通过剪切和粘贴直接编译代码)

首先,ip地址通常表示为(供人使用)单个字节的四分之一(四个数字以网络字节顺序由点分隔)而不是二进制序列

< P>地址(21211328)表示地址<代码> 1.67.168192<代码>(我猜这是错误的表示---你需要考虑所有IP地址都是在网络字节顺序中,最有意义的字节第一——地址<代码> 192.16867.1)

如果要成功地解码IP地址,首先要考虑的是,如果机器将以正确的字节数对待它,或者必须转换字节才能将其解释为数字。地址
192.168.67.1
的正确整数(十进制)应为
3232252673
。此数字不能表示为有符号整数,因为它有最重要的位,所以它将表示为负数

要解码IP地址,首先必须使用
ntohl(3)
函数将从套接字接口获得的数字转换为主机字节顺序(endianness)。一旦地址按主机字节顺序排列,就必须将数字转换为以256为基数。这非常简单,您可以使用以下代码片段来完成:

unsigned long ip_address = ntohl(server_address.sin_addr.s_addr);
int i;

for (i = 24; i >= 0; i -= 8) {
    if (i < 24) printf("."); /* print the dot between the numbers */
    printf("%d",
        (ip_address >> i) & 0xff);
}
这次的掩码是
0x01
,它只屏蔽数字的最小有效位

最后,我编写了一个完整的程序来说明两种解码方式,另外还展示了
ntohl(3)
函数的使用:

ipaddr.c 以虚线小数形式查看输出,以及

$ cc -o ipaddr -DDOTTED_DECIMAL=0 ipaddr.c
查看二进制数字的输出


(我包括行号,因此可以使用代码的引用和注释,这样您就可以通过剪切和粘贴直接编译代码)

二进制文件是表示IP地址的好方法吗?通常的格式是由四个小的十进制整数组成的序列。当然,如果您只想在打印的表示中使用0和1,那么您不能将32位数字放入32位。如果您确实需要二进制,请将其作为字符串处理。@Crumblez如果您知道确切的大小,是否可能您误解了二进制数及其表示形式
21211328
是二进制数的十进制表示形式(这是因为它是如何存储在内存中的)。其他可能的表示形式有十六进制、三进制、六进制和二进制。“但是数字是不变的。”克拉姆莱兹我想你不懂计算机中的数字。你的功能完全是荒谬的。它尝试将(二进制)10101010101010101010101010101010101010101010101010转换为(十进制)10101010101010101010101010101010101010,即(二进制)11111111110 111111111 00 00111111 011110010 0000101101 01010001 01001110 11100101 01100101 01100101 00001100 11101101 11100110 0010010,即uint104\t:)二进制是表示IP地址的好方法吗