python - Python 和 C 之间 ntohl 和 htonl 的不同行为

标签 python c sockets htonl

我试图在 Python 中模仿 C 程序某些部分的行为。他们都在读取一个二进制文件,其中每条记录都是长度->数据。 C 程序将从文件中提取长度字节,无论它是正数还是负数,ntohl() 都会返回正确的长度。然而,在 Python 中,即使长度记录是相同的值,当它是负数时我会得到一个 OverflowError:

length: 419495936

ntohl: 281

length: -2147418112

OverflowError: can't convert negative number to unsigned long

与 C 相比:

length: 419495936

ntohl: 281

length: -2147418112

ntohl: 384

我在这里做错了什么?如何让 Python 产生与 C 相同的结果?

用代码编辑

这是 C 代码:

while (fread(&rec_len, sizeof(unsigned int),  1, fp1) != 0) {
    printf("length: %d\n", rec_len);
    rec_len = ntohl(rec_len);
    printf("ntohl: %d\n", rec_len);

这是 Python:

with open(file, "rb") as f:
    pSize = struct.unpack('<i', f.read(4))[0]
    print "length: " + str(pSize)
    packetSize = socket.ntohl(pSize)
    print "ntohl: " + str(packetSize)
    while packetSize > 0:
        packet = f.read(packetSize)
        pSize = struct.unpack('<i', f.read(4))[0]
        print "length: " + str(pSize)
        packetSize = socket.ntohl(pSize)
        print "ntohl: " + str(packetSize)

最佳答案

您需要向 htonl() 传递一个正数。如果您无法更改读取值的方式,则可以使用以下代码:

>>> socket.htonl((-2147418112) & 0xffffffff)
384L

编辑:查看您的代码后,您可以更改 struct.unpack 以使用 '<I'这给你一个无符号数,甚至可以使用 '>I''!I'之后就不需要 ntohl() 了。

关于python - Python 和 C 之间 ntohl 和 htonl 的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11541944/

相关文章:

python - PostgreSQL 获取从主键到外键的序列值

c - popen() 对所有命令都是成功的

c - 带有函数指针的状态机 : how to set the function pointers?

java - 通过 java 套接字传输大文件

c# - 如何让 nanomsg 可靠地自动重新连接?

python - plotly :如何以十六进制显示轴刻度?

python - 如何在 python 中进行阻塞系统调用(并将其结果作为字符串获取)

python - 在 Python 中的绘图中创建自定义刻度标签

c - BENCH_INNER : lmbench3. 0 src代码宏查询

c# - 在每个方法中初始化一个新的套接字是一件好事吗?