cut de binárisra

hogy lehet egy fájlt szétdarabolni n-byteonként k-fájlra?
tehát mint a cut parancs (a split transzponáltja), csak ugye nem soronként

például n=1, k=3-nál mintha egy raw RGB képet akarnék három képre szétszedni

mindezt hatékonyan, gigabyteokra
c-ben már ugyan megírtam, pár sor az egész, csak kíváncsi vagyok van-e rá valami

Hozzászólások

Első olvasásra én is a split -b-t erőltettem volna, de most ha jól értem "demultiplexálni" szeretnéd a fájlt, és nem darabolni. Ilyen valszeg nincs - illetve már van, hogy megírtad.

dd-vel és a seek/skip kapcsolókkal tényleg meg lehet erőltetni egy szkriptben, de nagy fájl esetén a seekeléssel fog elmenni az idő nagyobb része, szóval mégse.

Ha már megemlítetted a splitet: az miért nem felel meg? Van neki -b (--bytes) opciója, éppen erre jó.

"hogy lehet egy fájlt szétdarabolni n-byteonként k-fájlra?"
Én csak erre a kérdésre válaszoltam. Elnézést, félreértettem, de most már sejtem mit szeretnél elérni. Tehát egy file-ból minden k-adik n byte méretű részt azonos file-ba írtani. (Nem pedig k darab n byte méretű részt külön file-ba.)

echo -n "rgbqweasd" > test.dat
bbe -b :3 -e 'd 1 2' test.dat

^- ez kiszedi a pirosat :)
Az a baj, hogy ez is lassú, és a legjobban úgy jársz, ha azt használod amit c-ben megírtál.

akkor ideblogom, egyrészt hogy megoldás is legyen, másrészt ha kell megtaláljam, harmadrészt pedig c-ben sohse programoztam és az is régen volt:),
szóval comments welcome


// cut input file (which can be stdin) to count files with
// given prefix by demupltiplexing given blocksize bytes
// usage: cut2 blocksize count input outfilenameformat
// example: raw RGB(3x16=48bit) to 3 gray(16bit) images
// cut2 2 3 raw out%0.3d
// note: writes only full blocksize*count bytes
#include < stdio.h >
#include < stdlib.h >
#include < malloc.h >
#define BUFF 4096 // try to write to each output at least
main(int argc, char **argv) {
  int i, j, k, s, c, b, r;
  FILE *f, **g;
  char gname[255];
  unsigned char *x, *y;
  s = atoi(argv[1]); // size of block
  c = atoi(argv[2]); // count of files
  f = fopen(argv[3], "rb"); // input
  g = (FILE**)malloc(sizeof(FILE*)*c);
  for (i=0; i < c; i++ ) {
    sprintf(gname, argv[4], i);//out filename
    g[i] = fopen(gname,"wb");
  }
  b = BUFF/s + (BUFF%s?1:0);
  x = (unsigned char*)malloc(s*c*b);
  y = (unsigned char*)malloc(s*c*b);
  while(r = fread(x,s*c,b,f)) {
    for(i = 0; i < r; i++)
    for(j = 0; j < c; j++)
    for(k = 0; k < s; k++)
      y[k+s*i+s*j*r] = x[k+s*j+s*c*i];
    for(i = 0; i < c; i++)
      fwrite(&(y[s*r*i]), s*r, 1, g[i]);
  }
  for(i = 0; i < c; i++) fclose(g[i]);
  fclose(f); free(g); free(y); free(x);
}