我听说过缓冲区溢出很多,并且相信我理解了这个问题,但我仍然没有看到一个说法的例子
char buffer[16];
//code that will over write that buffer and launch notepad.exe
Run Code Online (Sandbox Code Playgroud) 发生的事情是我正在读取加密数据包,我遇到一个损坏的数据包,它会返回一个非常大的随机数.
size_t nLengthRemaining = packet.nLength - (packet.m_pSource->GetPosition() - packet.nDataOffset);
seckey.SecretValues.m_data.resize(nLengthRemaining);
Run Code Online (Sandbox Code Playgroud)
在这段代码中,m_data是一个std::vector<unsigned char>.nLengthRemaining由于数据包损坏而过大,因此抛出调整大小函数.问题不在于调整大小(我们处理异常),但调整大小已经损坏了内存,这会导致更多异常.
我想要做的是在调用resize之前知道长度是否太长,然后只有调用resize才可以.我已经尝试在调用resize之前放入此代码:
std::vector<unsigned char>::size_type nMaxSize = seckey.SecretValues.m_data.max_size();
if(seckey.SecretValues.m_data.size() + nLengthRemaining >= nMaxSize) {
throw IHPGP::PgpException("corrupted packet: length too big.");
}
seckey.SecretValues.m_data.resize(nLengthRemaining);
Run Code Online (Sandbox Code Playgroud)
此代码使用std :: vector max_size成员函数来测试nLengthRemaining是否更大.但这肯定不可靠,因为nLengthRemaining仍然小于nMaxSize,但显然仍然足以导致调整大小出现问题(nMaxSize为4xxxxxxxxx且nLengthRemaining为3xxxxxxxxx).
另外,我还没有确定调整大小的异常.它不是std :: length_error,它不是std :: bad_alloc.真正抛出的例外对我来说并不重要,但我很想知道.
顺便说一句,您知道,这段代码在正常情况下可以正常工作.这种损坏数据包的情况是它疯狂的唯一地方.请帮忙!谢谢.
更新:
@迈克尔.现在,如果数据包大于5 MB,我将忽略该数据包.我将与其他团队成员讨论可能验证数据包的问题(它可能已存在,我只是不知道它).我开始认为它确实是我们的STL版本中的一个错误,它抛出的异常甚至不是std :: exception,这让我很惊讶.我将尝试从我的主管那里找出我们正在运行的STL版本(我将如何检查?).
另一个更新:我只是证明它是我在Visual Studio 6开发机器上使用的STL版本中的一个错误.我写了这个示例应用程序:
// VectorMaxSize.cpp:定义控制台应用程序的入口点.//
#include "stdafx.h"
#include <vector>
#include <iostream>
#include <math.h>
#include <typeinfo>
typedef std::vector<unsigned char> vector_unsigned_char;
void fill(vector_unsigned_char& v) {
for (int i=0; i<100; i++) v.push_back(i);
}
void …Run Code Online (Sandbox Code Playgroud) 我想从图像中提取椭圆区域(图像中面部分的一部分),最好是在MATLAB中:
例如,在此图像中,我想提取红色边界内的区域.
谁能帮我这个 ?
matlab image-processing computer-vision face-detection matlab-cvst
我在目录中有一些图像,我想加载所有这些图像进行一些处理.我尝试过使用这个load功能.
imagefiles = dir('F:\SIFT_Yantao\demo-data\*.jpg');
nfiles = length(imagefiles); % Number of files found
for i=1:nfiles
currentfilename=imagefiles(i).name;
I2 = imread(currentfilename);
[pathstr, name, ext] = fileparts(currentfilename);
textfilename = [name '.mat'];
fulltxtfilename = [pathstr textfilename];
load(fulltxtfilename);
descr2 = des2;
frames2 = loc2;
do_match(I1, descr1, frames1, I2, descr2, frames2) ;
end
Run Code Online (Sandbox Code Playgroud)
我收到一个错误,因为无法读取xyz.jpg没有找到这样的文件或目录,其中xyz是我在该目录中的第一个图像.
我还想从目录加载所有格式的图像,而不仅仅是jpg ......我怎么能这样做?
我正在使用MATLAB 2014a来提取BRISK和FREAK描述符.我找不到任何将位串大小减小到128或256的选项,它们都生成为512位.我认为FREAK不允许这种算法,但BRISK应该允许.有谁知道我是否可以减少BRISK描述符的维度?如果是,我该怎么办?
谢谢
假设我有一个带有int指针成员变量"i"的结构"s".我在s的默认构造函数中为i分配内存.稍后在代码的其他部分中,我将一个s值的实例传递给某个函数.我在这里做一个浅色的副本吗?假设我没有为s实现任何复制构造函数或赋值运算符或任何东西......只是默认的构造函数.
如何使用MATLAB从2D图像创建3D立体图像?
如何读取网格文件(.ply)并在Matlab中显示?
另外,如何更改上述型号的相机视点?
谢谢
我已经获得了rgb频道的图像.我只想看到这些人的脸.我该怎么办?神经网是否用于此?如果是这样,是否存在已经完成处理的神经网络的现有数据文件?
我目前有一个立体相机设置.我已经校准了两个摄像头并且具有用于摄像头K1和摄像头的内在矩阵K2.
K1 = [2297.311, 0, 319.498;
0, 2297.313, 239.499;
0, 0, 1];
K2 = [2297.304, 0, 319.508;
0, 2297.301, 239.514;
0, 0, 1];
Run Code Online (Sandbox Code Playgroud)
我还确定了F使用findFundamentalMat()OpenCV 的两台摄像机之间的基本矩阵.我已经使用一对相应的点x1和x2(在像素坐标中)测试了Epipolar约束,并且它非常接近0.
F = [5.672563368940768e-10, 6.265600996978877e-06, -0.00150188302445251;
6.766518121363063e-06, 4.758206104804563e-08, 0.05516598334827842;
-0.001627120880791009, -0.05934224611334332, 1];
x1 = 133,75
x2 = 124.661,67.6607
transpose(x2)*F*x1 = -0.0020
Run Code Online (Sandbox Code Playgroud)
从F我能够得到本质矩阵E为E = K2'*F*K1.我E使用MATLAB SVD函数进行分解,以获得K2相对于旋转和平移的4种可能性K1.
E = transpose(K2)*F*K1;
svd(E);
[U,S,V] …Run Code Online (Sandbox Code Playgroud)