TFileStream提供缓冲输出,这在大多数情况下都很好,但在某些情况下(特别是在调试期间),立即刷新缓冲区会很好.事情是,除了打电话给Free之外,我不知道有什么方法可以做到这一点,这有点适得其反.
有没有更好的方法呢?
我正在寻找一种更快的方法来完成这个:
int is_empty(char * buf, int size)
{
int i;
for(i = 0; i < size; i++) {
if(buf[i] != 0) return 0;
}
return 1;
}
Run Code Online (Sandbox Code Playgroud)
我意识到我正在寻找一种微观优化,除非在极端情况下,但我知道存在更快的方法,我很好奇它是什么.
在java中,最佳缓冲区大小为32 Kb,它仅基于所使用的cpu架构.在Android手机上,Dalvik VM是否能动态地知道cpu的正确缓存,以获得最大的缓冲区大小,而不依赖于许多不同的手机?如果是这样,我怎么能在运行时解决这个问题?
假设我想通过使缓冲区尽可能最大并且也是最快的来优化音频录制活动.我知道你可以得到它的最小尺寸,但最佳尺寸呢?
如何计算WriteableBitmap.WritePixels方法所需的缓冲区大小?
我使用带有四个参数的重载,第一个是Int32Rect,下一个是包含颜色的RGBA数字的字节数组,第三个是步幅(这是我的可写位图的宽度乘以每像素的位数除以通过8),最后一个是缓冲区(在Intellisense中称为偏移).
我在下面的代码中得到缓冲区大小不足够的运行时错误:
byte[] colourData = { 0, 0, 0, 0 };
var xCoordinate = 1;
var yCoordinate = 1;
var width = 2;
var height = 2;
var rect = new Int32Rect(xCoordinate, yCoordinate, width, height);
var writeableBitmap = new WriteableBitmap(MyImage.Source as BitmapSource);
var stride = width*writeableBitmap.Format.BitsPerPixel/8;
writeableBitmap.WritePixels(rect, colourData, stride,0);
Run Code Online (Sandbox Code Playgroud)
我需要使用什么公式来计算上面代码中所需的缓冲区值?
提前道歉我不能立即接受答案 - 只是想我想记下来,而我有问题......
简而言之:当我在Linux下使用用户空间C代码启动对usb-serial端口的写入时,我可以观察到三种不同的缓冲区大小 - 问题是,我想从用户空间C中检索所有这些大小代码本身.
比方说,我有一个带有FTDI FT232芯片的Arduino Duemillanove,它被编程为从PC读取来自usb /串行连接的输入字节,然后丢弃它们.当我在系统中插入此设备时(在Ubunty 11.04 Natty上执行此操作),我可以通过以下方式观察以下内容tail -f /var/log/syslog:
Mar 21 08:05:05 mypc kernel: [ 679.197982] usbserial: USB Serial Driver core
Mar 21 08:05:05 mypc kernel: [ 679.223954] USB Serial support registered for FTDI USB Serial Device
Mar 21 08:05:05 mypc kernel: [ 679.227354] ftdi_sio 2-2:1.0: FTDI USB Serial Device converter detected
Mar 21 08:05:05 mypc kernel: [ 679.227633] usb 2-2: Detected FT232RL
Mar 21 08:05:05 mypc kernel: [ 679.227644] usb 2-2: Number …Run Code Online (Sandbox Code Playgroud) 假设我有一个十六进制数据流,我想把它分成3个字节的块,我需要读取整数.
例如:给定一个十六进制字符串,01be638119704d4b9a我需要读取前三个字节01be63并将其读作整数114275.这就是我得到的:
var sample = '01be638119704d4b9a';
var buffer = new Buffer(sample, 'hex');
var bufferChunk = buffer.slice(0, 3);
var decimal = bufferChunk.readUInt32BE(0);
Run Code Online (Sandbox Code Playgroud)
这readUInt32BE对4字节数据非常有效,但在这里我明显得到:
RangeError: index out of range
at checkOffset (buffer.js:494:11)
at Buffer.readUInt32BE (buffer.js:568:5)
Run Code Online (Sandbox Code Playgroud)
如何正确读取3字节作为整数?
我阅读了许多关于strcpy,memcpy等不安全函数的文章,这些函数在处理外部数据时可能会导致安全问题,例如文件内容或来自套接字的数据.这可能听起来很愚蠢,但我写了一个易受攻击的程序,但我没有设法"破解"它.
我理解缓冲区溢出的问题.以此示例代码为例:
int main() {
char buffer[1];
int var = 0;
scan("%s", &buffer);
printf("var = 0x%x\n", var);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我执行程序并输入"abcde"时,程序输出0x65646362,它是十六进制+ little-endian中的"edcb".但是我读到你可以修改在堆栈上推送的eip值,以使程序执行一些不需要的代码(例如,在调用system()函数之前).
但是函数的程序集开始如下:
push %ebp
mov %ebp, %esp
and $0xfffffff0, %esp
sub $0x20, %esp
Run Code Online (Sandbox Code Playgroud)
由于%esp的值在函数开始时是随机的,并且由于这个"和",似乎没有可靠的方法将精确值写入推入的eip值.
此外,我读到可以执行你在缓冲区中编写的代码(这里缓冲区只有1个字节长,但实际上它足够大,可以存储一些代码)但是你会给依次提供什么值的eip这样做(考虑到缓冲区的位置是随机的)?
那么为什么开发人员如此担心安全问题(除了程序可能崩溃)?你有一个易受攻击的程序的例子,以及如何"破解"它来执行不需要的代码?我在linux上试过这个,Windows不太安全吗?
为了你的"重复"的狂热分子,对这样的权利类似的问题在这里.不同之处在于我画了一个生动的例子,我无法理解其输出.
对于文档的JspWriter和PrintWriter的说,有两点不同:1的JspWriter可以抛出异常,应该的PrintWriter不这样做.2. JspWriter在场景后面使用PrintWriter,但由于默认情况下JSP页面是缓冲的,因此直到the buffer is flushedJSP页面上下文中的任何含义都不会创建PrintWriter .我不确定我是否理解了最后一部分.考虑这个JSP页面:
<%@page import="java.io.PrintWriter"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JspWriter versus PrintWriter</title>
</head>
<body>
<p>I should be row one.</p>
<%
out.println("<p>JspWriter said: I should be the second row.</p>");
PrintWriter pw = response.getWriter();
pw.println("<p>PrintWriter said: I should be the third row.</p>");
%>
<p>I should be the fourth row.</p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
它产生以下输出:
PrintWriter said: I should be the third row. …Run Code Online (Sandbox Code Playgroud) 我正在阅读关于I/O的cplusplus.com教程.最后,它说fstream缓冲区与光盘上的文件同步
明确地,使用操纵器:当在流上使用某些操纵器时,会发生显式同步.这些操纵器是:flush和endl.
和
显式地,使用成员函数sync():调用流的成员函数sync(),它不带参数,导致立即同步.如果流没有关联的缓冲区或者出现故障,则此函数返回一个等于-1的int值.否则(如果流缓冲区已成功同步),则返回0.
除了一些其他隐式案例(例如destroy和stream.close())
在我的代码中,我总是使用flush().
有关std :: flush()的文档:
刷新流缓冲区
将与流关联的缓冲区同步到其受控输出序列.这实际上意味着缓冲区中的所有未写入字符都会尽快写入其受控输出序列("刷新").
有关std :: streambuf :: sync()的文档:
将输入缓冲区与字符源同步
调用它来使流缓冲区与受控序列同步(就像文件流中的文件一样).公共成员函数pubsync调用此受保护的成员函数来执行此操作.
如果这是一个新手问题,请原谅我; 我是个菜鸟.
我可以使用这种技术指定scanf要读取的最大字符数buffer:
char buffer[64];
/* Read one line of text to buffer. */
scanf("%63[^\n]", buffer);
Run Code Online (Sandbox Code Playgroud)
但是如果我们在编写代码时不知道缓冲区长度怎么办?如果它是函数的参数怎么办?
void function(FILE *file, size_t n, char buffer[n])
{
/* ... */
fscanf(file, "%[^\n]", buffer); /* WHAT NOW? */
}
Run Code Online (Sandbox Code Playgroud)
此代码容易受到缓冲区溢出的影响,因为fscanf不知道缓冲区有多大.
我记得以前见过这个,并开始认为这是解决问题的方法:
fscanf(file, "%*[^\n]", n, buffer);
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是,*in "%*[*^\n]"意味着最大字符串大小传递一个参数(在这种情况下n).这就是*in 的含义printf.
当我检查文档时,scanf我发现它意味着scanf应该丢弃结果[^\n].
这让我有些失望,因为我认为能够动态传递缓冲区大小是一个非常有用的功能scanf.
有没有办法可以scanf动态地传递缓冲区大小?