Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.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
python打印语句修复溢出错误_Python_Casting - Fatal编程技术网

python打印语句修复溢出错误

python打印语句修复溢出错误,python,casting,Python,Casting,我正在入侵一个安全系统DVR,以便在python(2.6版)中添加运动捕捉和其他有趣的功能。我能够从java反编译并转换为python的函数之一是: def ToInt(abyte0, i): if(abyte0[i] >= 0): j = abyte0[i] print "A " + str(j) else: j = 256 + abyte0[i] if abyte0[i + 1] >= 0: j = j + (aby

我正在入侵一个安全系统DVR,以便在python(2.6版)中添加运动捕捉和其他有趣的功能。我能够从java反编译并转换为python的函数之一是:

def ToInt(abyte0, i):

  if(abyte0[i] >= 0):
      j = abyte0[i]
      print "A " + str(j)
  else:
      j = 256 + abyte0[i]

  if abyte0[i + 1] >= 0:
      j = j + (abyte0[i + 1] * 256)
      print "A " + str(j)
  else:
      j = j + (256 + abyte0[i + 1]) * 256

  if abyte0[i + 2] >= 0:
      j = j+ abyte0[i + 2] * 256 * 256
      print "A " + str(j)
  else:
      j = j + (256 + abyte0[i + 2]) * 256 * 256

  if abyte0[i + 3] >= 0:
      j = j + abyte0[i + 3] * 256 * 256 * 256
      print "A " + str(j)
  else:
      j = j + (256 + abyte0[i + 3]) * 256 * 256 * 256

  return j
我在上面添加了打印语句,以查看在我弄清楚事情的过程中发生了什么。现在,我已经让它工作,我回去删除打印语句,我得到一个错误

Traceback (most recent call last):
  File "C:\Users\...\videostuff.py", line 154, in <module>
  ReadData(i)
    File "C:\Users\..\videostuff.py", line 122, in ReadData
    data = s.recv(DATA_SIZE)
    OverflowError: long int too large to convert to int
所有法典:

import socket
from array import array
import Image
import StringIO
import sys

def ToInt(abyte0, i):

    if(abyte0[i] >= 0):
        j = abyte0[i]
        #print "A " + str(j)
    else:
        j = 256 + abyte0[i]

    if abyte0[i + 1] >= 0:
        j = j + (abyte0[i + 1] * 256)
        #print "A " + str(j)
    else:
        j = j + (256 + abyte0[i + 1]) * 256

    if abyte0[i + 2] >= 0:
        j = j+ abyte0[i + 2] * 256 * 256
        #print "A " + str(j)
    else:
        j = j + (256 + abyte0[i + 2]) * 256 * 256

    if abyte0[i + 3] >= 0:
        j = j + abyte0[i + 3] * 256 * 256 * 256
        #print "A " + str(j)
    else:
        j = j + (256 + abyte0[i + 3]) * 256 * 256 * 256

    return j

def StrLen(abyte0):
    for i in len(abyte0):
        if abyte0[i] == 0:
            return i

def StrLen(abyte0, i):
    for j in len(abyte0):
        if abyte0[i] == 0:
            return i
        else:
            i = i + 1

def Connect(s):
    out_header = array('B', [32, 0, 0, 0, 205, 0, 0, 0])
    data = array('B', [0, 0, 0, 0, \
                       5, 0, 0, 0, \
                       0, 0, 0, 0, \
                       0, 0, 0, 0, \
                       0, 0, 0, 0, \
                       0, 0, 0, 0, \
                       0, 0, 0, 0  \
                       ])

    #print 'sending data: '
    #print out_header.tostring()
    #print out_header.buffer_info()
    #print struct.unpack('BBBBBBBBB', out_header)
    s.send(out_header)
    s.send(data)

def ReadHeader():
    global DATA_SIZE
    global DATA_TYPE

    DATA_SIZE = 32

    # Read the reply header
    data = s.recv(HEADER_SIZE)
    data_string = array('B', data)

    i = ToInt(data_string.tolist(), 0)

    # First byte tells how big the data wil be
    if i > 4 and (i - 4) > DATA_SIZE:
        DATA_SIZE = i - 4

    print "DATA_SIZE is " + str(DATA_SIZE)

    # Second byte tells what the data is
    DATA_TYPE = data_string[4]

    #if DATA_TYPE == 1:
    #    print "Dunno"
    #elif DATA_TYPE == 106:
    #    print "MESSAGE"
    #elif DATA_TYPE == 207:
    #    print "IMAGE"
    #elif DATA_TYPE == 0:
    #    print "FALSE"
    #else:
    #    print "ERROR"

def ReadData(i):
    global DATA_SIZE

    #if DATA_SIZE > sys.maxint:
    #    DATA_SIZE = sys.maxint

    data = s.recv(DATA_SIZE)

    data_string = array('B', data)
    #afile = open("Dataz.txt", 'w')
    #data_string.tofile(afile)
    #print data_string

    abyte0 = data_string.tolist()

    #draw image
    image_w = ToInt(abyte0, 0)
    image_h = ToInt(abyte0, 4)

    # should be around 9k
    image_data_length = ToInt(abyte0, 72)

    datas = data_string[76:]

    file1 = open("Dataz.jpg", 'wb')
    datas.tofile(file1)
    file1.close()
    #print "Length of image data is: " + str(len(datas))

    #file = StringIO.StringIO(datas)
    #file1 = open("Dataz1.jpg", 'rb')
    #image = Image.open(file1)
    #image.show()

#Global variables
TCP_IP = '192.168.1.106'
TCP_PORT = 17860    
HEADER_SIZE = 8
DATA_SIZE = 32

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))

#Starts channel 1
Connect(s)

ReadHeader()

#first data contains the channel name and status
data = s.recv(DATA_SIZE)
data_string = array('B', data)

# Second data should be first image
ReadHeader()
ReadData(0)

for i in range(1, 20):
    ReadHeader()
    ReadData(i)

s.close()
如果传递的socket.recv()值大于2147483647(十六进制0x7fffff),Python将尝试使用长整数而不是常规整数。显然,您的数据大小值被认为大于此值

ToInt()代码似乎试图从单个字节中构建一个整数,并且可能没有正确地进行转换(特别是尝试处理负值的部分)。通常,当从类C语言转换代码时,我将在这里的集合中包括Java,您希望找到一种更高级的方式来表达代码,而不是使用单个字节和字符

尝试使用标准库进行转换,而不是使用字节。确保指定正确的字节顺序(大/小尾端)以获得正确的结果。例如,假设您的数据是一个4个字符的字符串,其中第一个字符表示最小的值,这可能会:

>>> import struct
>>> i = struct.unpack('<L', '\x23\x45\x00\x73')[0]
>>> print i
1929397539
导入结构 >>>i=struct.unpack(“如果传递socket.recv()值大于2147483647(十六进制0x7fffffff),Python将尝试使用长整数而不是常规整数。显然,您的数据大小值被认为大于该值

ToInt()代码似乎试图从单个字节中构建一个整数,并且可能没有正确地进行转换(特别是尝试处理负值的部分).通常,当从类C语言转换代码时,我将在这里的集合中包括Java,您希望找到一种更高级的方式来表达代码,而不是使用单个字节和字符

尝试使用标准库进行转换,而不是使用字节。确保指定正确的字节顺序(大端/小端)以获得正确的结果。例如,假设数据是一个4个字符的字符串,其中第一个字符表示最小的值,则可能会这样做:

>>> import struct
>>> i = struct.unpack('<L', '\x23\x45\x00\x73')[0]
>>> print i
1929397539
导入结构
>>>i=struct.unpack(“下面是一个问题示例

if abyte0[i + 3] >= 0:
    j = j + abyte0[i + 3] * 256 * 256 * 256
    #print "A " + str(j)
else:
    j = j + (256 + abyte0[i + 3]) * 256 * 256 * 256
让我们假设
j==0
abyte0==(0,0,0,0)
i==0

>>> j + (256 + abyte0[i + 3]) * 256 * 256 * 256
4294967296L

结果是一个长值。无论是否使用
print
语句,此语句都不太可能是正确的。问题的“现在我让它工作了”部分不太可能从一开始就完全正确。这使得“删除print语句,我会得到一个错误”这也不太可能是真的。

这里有一个问题的例子

if abyte0[i + 3] >= 0:
    j = j + abyte0[i + 3] * 256 * 256 * 256
    #print "A " + str(j)
else:
    j = j + (256 + abyte0[i + 3]) * 256 * 256 * 256
让我们假设
j==0
abyte0==(0,0,0,0)
i==0

>>> j + (256 + abyte0[i + 3]) * 256 * 256 * 256
4294967296L

结果是一个长值。无论是否使用
print
语句,此语句都不太可能是正确的。问题的“现在我让它工作了”部分不太可能从一开始就完全正确。这使得“删除print语句,我会得到一个错误”也不太可能是真的。

你的错误与发布的代码无关,你的第122行在哪里?你在哪里读取数据?-1:代码仍然没有显示数据大小的值是如何设置的。请发布实际显示问题的最小代码。我们希望能够运行你的代码。不要猜测缺失了什么。你们真是太棒了needy 8)您的错误与发布的代码无关,您的第122行在哪里?您在哪里读取数据?-1:代码仍然没有显示数据大小的值是如何设置的。请发布实际显示问题的最小代码位。我们希望能够运行您的代码。不要猜测缺少什么。你们太需要了8)我可能只是用这个来实现它,而忘记了反编译的代码。仍然不确定为什么它可以在适当的位置使用打印语句……正如其他人所说,它很可能实际上不“工作”,它只是没有显示特定的错误,可能是由于打印带来的小延迟。当打印更改行为时,请查看打印代码引发的异常(但在其他地方捕获,通常是通过未指定特定异常的“blanktry/except”语句)或延迟的影响。打印完成时,套接字可能已接收到更多数据。我不能说在你的特殊情况下,除了它不可能真的在所有情况下工作的代码之前。我不生气,没有人相信我,我会以同样的方式。但实际上我正在通过网络将图像保存到文件中,所以我想说它正在工作。别误会。我不认为有人说它根本不起作用。我们只是说打印语句不可能起作用,所以它更可能只是有时起作用,而由于其他原因失败。也许是间歇性的?取决于特定数据包中的特定值?如果你可以控制输入数据(例如复制一个“罐装”版本),尝试打印和不打印,并在结果之间获得100%的相关性,那么这可能会比看起来的更多。。。我们对这些指纹的看法也可能是错误的@杰克,好极了!感谢您继续关注结果。很少有人会这么做。我可能会用这个来实现它,而忘记反编译的代码。仍然不确定为什么它可以在适当的位置使用打印语句……正如其他人所说,它很可能实际上不“工作”,它只是没有显示特定的错误,可能是由于打印带来的小延迟。当打印更改行为时,查找由打印代码引发的异常