我是Python的新手(虽然我已经用Java编程多年了),我正在开发一个简单的基于套接字的网络应用程序(只是为了好玩).我的想法是我的代码连接到远程TCP端点,然后侦听从服务器推送到客户端的任何数据,并对此执行一些解析.
从服务器 - >客户端推送的数据是UTF-8编码文本,每行由CRLF(\x0D\x0A)分隔.您可能已经猜到:想法是客户端连接到服务器(直到被用户取消),然后在它们进入时读取和解析这些行.
我已经设法让这个工作,但是,我不确定我这样做是否正确.因此,我的实际问题(代码要遵循):
asyncore?目前,数据正在被读取和缓冲,如下所示:
def handle_read(self):
self.ibuffer = b""
while True:
self.ibuffer += self.recv(self.buffer_size)
if ByteUtils.ends_with_crlf(self.ibuffer):
self.logger.debug("Got full line including CRLF")
break
else:
self.logger.debug("Buffer not full yet (%s)", self.ibuffer)
self.logger.debug("Filled up the buffer with line")
print(str(self.ibuffer, encoding="UTF-8"))
Run Code Online (Sandbox Code Playgroud)
该ByteUtils.ends_with_crlf函数只是检查缓冲区的最后两个字节\x0D\x0A.第一个问题是主要问题(答案是基于此),但任何其他想法/提示都表示赞赏.谢谢.
如果缓冲区有足够的空间,我有一个函数将整数复制到缓冲区
void copy_int(int val, void *buf, int maxbytes)
{
if (maxbytes-sizeof(val) >= 0)
mempcy(buf, (void *) &val, sizeof(val));
}
Run Code Online (Sandbox Code Playgroud)
问题是它总是将值复制到缓冲区,即使maxbytes太小也是如此.我不知道这是为什么?
我认为这是不可能的,但我用我的软件看到它.我已经构建了一个包装器对象来管理我的缓冲区对象(我正在使用共享上下文,所以我不能使用VAO),并且VBO方面的工作正常,直到我开始用IBO测试它(glDrawElements(),我' m使用纯OpenGL 3+环境).
以下是向我的对象添加缓冲区的代码(Sy_GLObject):
QList< uint > Sy_GLObject::addBuffers( uint numBuffers, GLenum target,
GLenum numericType, GLenum usage )
{
uint* adds = new uint[numBuffers];
glGenBuffers( numBuffers, adds );
QList< uint > l;
for ( uint i = 0; i < numBuffers; ++i ) {
Buffer buffer( target, adds[i], 0, numericType, usage );
buffers_ << buffer;
l << i;
}
delete[] adds;
Sy_GL::checkError();
return l;
}
Run Code Online (Sandbox Code Playgroud)
并且此函数返回的缓冲区名称很好,直到此代码调用它:
void Sy_BVH::initialiseGLObject()
{
Sy_application::getMainWindow()->getActiveProject(
)->getModelContext()->makeCurrent();
GLuint vLoc = Sy_settings::get( "shader/flat/vertexLoc" ).toUInt();
drawBBs_ = Sy_GLObject::createObject();
// …Run Code Online (Sandbox Code Playgroud) 我编写了printf的实现 - myPrintf,它打印到stdout.我想验证它是否正常工作.为了检查打印输出的相关性,我想将它与我希望得到的char进行比较.如何编写代码以将stdout重定向到缓冲区,而不是使用>.
我只能使用printf!
我想知道我是否可以使用fread将数据读入整数缓冲区.我看到fread()将void*作为第一个参数.所以我不能只传递一个整数缓冲区(类型转换为void*)然后使用它来读取我想要的文件中的howmuchevery字节,只要缓冲区足够大?
即.我无法做到:
int buffer[10];
fread((void *)buffer, sizeof(int), 10, somefile);
// print contents of buffer
for(int i = 0; i < 10; i++)
cout << buffer[i] << endl;
Run Code Online (Sandbox Code Playgroud)
这有什么不对?
谢谢
我正在使用C++中的指针和缓冲区来检查我的技能.我尝试了下面的代码,一切正常.没有泄漏,没有崩溃,没有.
说实话,我没想到这一点.
当我打电话时,char* buf2 = new char[strlen(buf)]我没想到srlen(buf)返回合适的尺寸.我一直认为strlen
需要一个以NULL结尾的字符串才能工作.这不是这样的,为什么它正在使用这段代码?
int main(){
const char* mystr = "mineminemine";
char* buf = new char[strlen(mystr)];
memcpy(buf, mystr, strlen(mystr));
char* buf2 = new char[strlen(buf)];
memcpy(buf2, buf, strlen(buf));
delete[] buf2;
delete[] buf;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试将一个int数组写入fstream,但是当我调用时,我得到了一个异常fstream.write.
我可以fstream用来将int数组写入文件吗?
int main(int argc, char * argv[])
{
fstream amostra("D:\\Amostra.txt", ios::out | ios::binary);
const int total_elements_block = 1024;
const int buffer_size = total_elements_block;
const int total_buffer = 10;
int * buffer = new int [buffer_size];
//for (int j=0; j<total_buffer; j++){
for (int i =0; i<total_elements_block; i++){
buffer[i] = i;
}
amostra.write((char *)(&buffer), total_elements_block*4);
//}
amostra.close();
delete []buffer;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我有这样的char缓冲区
char *buff = "aaaa0006france";
Run Code Online (Sandbox Code Playgroud)
我想提取字节4到7并将其存储在int中.
int i;
memcpy(&i, buff+4, 4);
printf("%d ", i);
Run Code Online (Sandbox Code Playgroud)
但它会打印垃圾值.
这有什么问题?
我想将数据写入char缓冲区.因此,我有一个格式化数据的功能.作为一个例子,我只是将一个int值传递给函数,如下所示:
using namespace std;
#include <iostream>
char* writeData(int iData, char* sBufferData){
sprintf_s(sBufferData, 2048, "val:%i", iData);
return sBufferData;
}
int _tmain(int argc, _TCHAR* argv[])
{
char sBuffer[2048];
char sBufferData[2048];
sprintf_s(sBuffer, 2048, "%s, %s",
writeData(1, sBufferData),
writeData(2, sBufferData)
);
printf(sBuffer);
cin.get();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但输出结果为:val:1,val:1
我想要的是:val:1,val:2
有人可以向我解释,为什么我在最终缓冲区中获得两次1值?
我试图用缓冲区将整个文件读入缓冲区 std::ifstream该失败没有明显的原因,所以我构建了一个演示问题的最小代码示例:
std::vector<char> vec;
vec.resize(1000);
std::ifstream file("G:/Pictures/Webcam/Snapshot_20110209.jpg");
file.exceptions(std::ifstream::badbit | std::ifstream::failbit | std::ifstream::eofbit);
std::cout << file.good() << std::endl;
try {
file.read(vec.data(), 100);
} catch (std::ios_base::failure f) {
std::cout << f.what() << " Characters extracted: " << file.gcount() << std::endl;
} catch (...) {
std::cout << "Some other error" << std::endl;
}
std::cout << "Done" << std::endl;
file.close();
Run Code Online (Sandbox Code Playgroud)
我正在尝试读取的文件大小为48kb,因此读取100个字节应该不是问题.1000字节的缓冲区很大,所以也应该没问题.现在,发生的是流只读取61个字节,然后设置failbit.生成的输出如下:
1
ios_base::failbit set: iostream stream error Characters extracted: 61
Done
Run Code Online (Sandbox Code Playgroud)
因此,出于某种原因,故障位置设置在61个字节之后.如果我读取少于61个字节,它的工作原理.如果我尝试阅读更多,它也会在61处失败.我也尝试过类似大小,同样问题的其他文件.一些完全不同的不同大小的文件显示相同的行为,但在166字节之后.
现在,如果我使用Qt的QFile类来读取数据,一切正常,我可以读取完整的文件.代码如下所示:
QFile file(path);
std::vector<char> buffer;
buffer.resize(file.size());
if (!file.open(QIODevice::ReadOnly)) return; …Run Code Online (Sandbox Code Playgroud)