C++ libpng错误:PNG无符号整数超出范围

C++ libpng错误:PNG无符号整数超出范围,c++,libpng,C++,Libpng,在尝试从内存中读取PNG时,我遇到了一个奇怪的错误: libpng error:: PNG unsigned integer out of range 此错误是由以下原因引起的: png_read_info(png_ptr,info_ptr); 它使用以下处理程序: static void ReadDataFromBuffer(png_structp png_ptr, png_bytep outBytes, png_size_t byteCountToRead){ P

在尝试从内存中读取PNG时,我遇到了一个奇怪的错误:

libpng error:: PNG unsigned integer out of range
此错误是由以下原因引起的:

png_read_info(png_ptr,info_ptr);
它使用以下处理程序:

static void ReadDataFromBuffer(png_structp png_ptr, png_bytep outBytes,
    png_size_t byteCountToRead){
        PNGDataPtr dataptr=(PNGDataPtr)png_get_io_ptr(png_ptr);
        png_uint_32 i;
        cout<<byteCountToRead<<endl;
        cout<<&outBytes<<endl;
        cout<<dataptr->len<<endl;
        cout<<dataptr->p<<endl;

        if(byteCountToRead>dataptr->len){
            png_error(png_ptr,"EOF");
            return;
        }

        for(i=0;i<byteCountToRead;i++){

            outBytes[i]=dataptr->p[i];
        }
        dataptr->p+=byteCountToRead;
        dataptr->len-=byteCountToRead;
        png_uint_32 a = png_get_uint_32(outBytes);
        cout<<a<<" "<<PNG_UINT_31_MAX<<endl;

}
所以我检查了png_get_uint_32(outBytes)的值,它确实高于png_uint_31_MAX,确切地说是230374511

我该如何解决这个问题

编辑:

关于永久正常贸易关系的一些澄清:

typedef struct{
    png_bytep p;
    png_uint_32 len;
} PNGData,*PNGDataPtr;
打电话的时候

png_set_read_fn(png_ptr,(png_voidp) &pngdata, ReadDataFromBuffer);
pngdata表示一个pngdata对象,它有一个指向my databuffer的指针,my databuffer在内存中包含整个PNG,len包含整个PNG的大小,介于40到80KB之间

编辑:这里有一个链接,指向我使用fwrite保存收到的数据时得到的png文件:

之前我写道: 你可能把endian条件搞混了

编辑:
当您本应跳过前8个字节时,您正在读取PNG签名。您的报告有一个输入错误:数字实际上是2303741511(您在问题中省略了一个“1”),它是字节字符串“\211 P N G”

在代码中解决此问题的一个方法是使用

png_set_sig_bytes(png_ptr,0)

通知libpng您的数据指针指向8字节签名的开头,读者需要跳过它们。

您是否可以包含指向实际PNG的链接?可能它不是一个有效的PNG…实际的PNG从未实际保存。它是一个深度矩阵,在内存中压缩成png,然后通过网络发送。我现在正在尝试解码png,以便再次访问我的深度矩阵。这听起来可能有点不靠谱,但当我用fwrite将接收到的数据缓存保存为png文件而不是在内存中解码时,我可以打开它并观看表示正确深度矩阵的png(可以识别人和对象)。databuffer由一个char数组(char*)表示,这会导致问题吗?更新了OP并提供了更多信息感谢您的响应,我将如何尝试修复此问题?我是个大新手。我不能只使用htonl和ntohl函数,因为我是通过网络发送png的吗?当然可以。但是,无论您是通过网络发送还是仅仅编写文件,都只转换多字节整数,而不是像素字节和其他单字节内容。数据流中的任何多字节整数必须是网络字节顺序。但是深度值在0到5000之间,因此PNG被设置为16位。这不意味着我也必须使用像素字节上的函数吗?即使没有hotnl和ntohl函数,在服务器端的原始数据缓存上使用fwrite也会产生与客户端完全相同的png,这难道不奇怪吗?对不起,我的无知,顺便说一句,我在这个问题上的经验是相当有限的。是的,16位颜色和alpha样本也需要首先是最重要的字节。Fread/fwrite处理字节,因此它们不关心字节顺序。
png_set_sig_bytes(png_ptr,0)