如何从缓冲区读取反馈,所以不缓冲溢出?

时间:2010-02-14 03:36:11

标签: c buffer-overflow

我有这段代码

#define BUFFER_LEN (2048)
static float buffer[BUFFER_LEN];
int readcount;

while ((readcount = sf_read_float(handle, buffer, BUFFER_LEN))) {
  // alsa play
}

从缓冲区读取BUFFER_LEN浮点数,并返回它实际读取的浮点数。 “handle”告诉sf_rad_float缓冲区有多大。

E.g。如果缓冲区包含5个浮点数,BUFFER_LEN为3,则readcount将首先返回3,下一次为2,并且while循环将退出。

我希望有一个同样的功能。

更新

经过大量编码后,我认为这是解决方案。

#include <stdio.h>

int copy_buffer(double* src, int src_length, int* src_pos,
                float* dest, int dest_length) {

  int copy_length = 0;

  if (src_length - *src_pos > dest_length) {
    copy_length = dest_length;
    printf("copy_length1 %i\n", copy_length);
  } else {
    copy_length = src_length - *src_pos;
    printf("copy_length2 %i\n", copy_length);
  }

  for (int i = 0; i < copy_length; i++) {
    dest[i] = (float) src[*src_pos + i];
  }

  // remember where to continue next time the copy_buffer() is called
  *src_pos += copy_length;

  return copy_length;
}

int main() {

  double src[] = {1,2,3,4,5};
  int src_length = 5;

  float dest[] = {0,0};
  int dest_length = 2;

  int read;
  int src_pos = 0;
  read = copy_buffer(src, src_length, &src_pos, dest, dest_length);
  printf("read %i\n", read);
  printf("src_pos %i\n", src_pos);

  for (int i = 0; i < src_length; i++) {
    printf("src %f\n", src[i]);
  }

  for (int i = 0; i < dest_length; i++) {
    printf("dest %f\n", dest[i]);
  }

  return 0;

}

下次调用copy_buffer()时,dest包含3,4。再次运行copy_buffer()仅复制值“5”。所以我认为它现在有效。

虽然不是很漂亮,但我int src_pos = 0;外面copy_buffer()

如果我可以给copy_buffer()一个唯一的句柄而不是&src_pos,那就好了,就像sndfile一样。

有谁知道如何做到这一点?

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

我开始看它,但你也可以这样做: libsndfile 是开源的,所以可以看看sf_read_float()是如何工作的,并创建一个函数来自缓冲区的同样的事情。 http://www.mega-nerd.com/libsndfile/有一个下载链接。