LINUX.ORG.RU

переделать вид записи числа на C


0

0

есть строка пикселов, которая вида \xff\x43 и т.д., т.е. каждое число меняет свое значение от 0 до 255

как можно на сях переделать эту строку в десятичный вид, чтобы между числами пробелы стояли? Чего посмотреть для этого?

Спасибо!

☆☆

А нельзя уточнить как представляются пиксели: байт на пиксель, два байт или сколько там?

Но в общем это не важно, делашь указатель типа char *p; и идешь циклом по строке.

пройдя нужное растояние зависящее от того сколько байт на пиксель копируешь эти байты принадлежащие пикселю в int tmp; а потом выводишь его и ставишь после него пробел.

В чем проблемма?

anonymous
()
Ответ на: комментарий от anonymous

проблема в том, что перловый скрипт при помощи функции unpack "C" для 
каждого элемента преобразовывает числа медленно (порядка секунды) для 
картинки размером 640x480. В Gtk2 есть функция которая за полсекунды 
умеет из картинки 640x480 получать строку вида \xff\x45 ... etc... 
(где каждое число, кажется это шестнадцатеричный вид, - яркось одного пиксела) но не строку вида 255 234 234. 

Да, три байта на пиксель, 
но в некоторых картинках - четыре байта (RGB формат записи и CMYK 
например). Вобщем, в моих картинках только три байта. 

Вобщем, как я планировал, вот перловый код, которым я получаю строку 
$pixels, которая вида "\xff\x45 ... etc...", но она в "машинном коде":

#!/usr/bin/perl

use strict;
use warnings;
use Glib qw(FALSE TRUE);
use Gtk2 -init;

die "Usage: $0 imagefile\n" unless @ARGV;
my $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file ($ARGV[0]);
my $pixels = $pixbuf->get_pixels;

while ($pixels =~ /.(.)./gs){
# тут что-то делаю спикселом при помощи unpack "C" => $1.
}

но хотелось бы обойтись без последнего цикла while, который заменить
 сишной вставкой(это вроде умею), которая собственно возвращала бы значения пикселов 

#!/usr/bin/perl

use ExtUtils::testlib;
use Mytest;

Mytest::pixels($pixels);

где pixels - сишная функция(которую можно вызывать из перла), которая превращает пикселы в нормальный для расчетов вид.

ну короче тут долго можно рассказывать, но, как сделаю, выложу в 
новости на LOR, это датчик дождя вобщем по картинке неба с вебкамеры. 
Перловый вариант работает, но  медленно, где-то 30 секунд обсчитывает одну картинку.

vilfred ☆☆
() автор топика
Ответ на: комментарий от nobody

угу, спасибо! Если не выйдет на сях, то буду этим пользоваться.

vilfred ☆☆
() автор топика
Ответ на: комментарий от anonymous

короче говоря мне посоветовали код, который посылает меня нафиг:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int main() {
    
    const char* s = "\xff\x43\x11\x22";
    const int n = strlen(s);

    // под новую строку память выделяем динамически
    // 3 максимальный размер числа (255) + 1 пробел
    char * s2 = new char[(3+1)*n+1];

    // указатель на конец новой строки
    char * p = s2;

    // закрываем новую строку
    *p = 0;

    for(int i=0; i<n; i++) {

        // представляем число в виде строки
        p += sprintf(p, (i? " %u": "%u"), (unsigned char)s[i]);
    }

    // вот
    printf("'%s'\n", s2);
    
    // убираем за собой
    delete[] s2;

    return 0;
}

компилирую и получаю ошибки:

[vilfred@observ Mytest]$ gcc -O3 rr.c -o rr
rr.c: In function `main':
rr.c:9: `new' undeclared (first use in this function)
rr.c:9: (Each undeclared identifier is reported only once
rr.c:9: for each function it appears in.)
rr.c:9: parse error before "char"
rr.c:14: `for' loop initial declaration used outside C99 mode
rr.c:21: `delete' undeclared (first use in this function)
rr.c:21: parse error before ']' token
[vilfred@observ Mytest]$

[vilfred@observ Mytest]$ gcc -v
Reading specs from /usr/lib/gcc-lib/i386-asplinux-linux/3.2.2/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --host=i386-asplinux-linux
Thread model: posix
gcc version 3.2.2 20030222 (ASPLinux 3.2.2-5asp)
[vilfred@observ Mytest]$

[vilfred@observ Mytest]$ uname -a
Linux observ.inetcomm.ru 2.4.20-20.9observ #4 Срд Окт 29 19:02:13 MSK 2003 i686 i686 i386 GNU/Linux
[vilfred@observ Mytest]$

vilfred ☆☆
() автор топика
Ответ на: комментарий от vilfred

А что, perl сможет выдернуть функцию из плюсового файла?
Вот тебе на си (на всякий случай):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int fn(const unsigned char *in)
  {
  size_t n = strlen(in);

  char *out, *mem = malloc(n * 4 + 1);
  if (!mem)
    {
    fputs("out of memory\n", stderr);
    return 1;
    }

  for (out = mem; n; n--)
    {
    int a, b = *in++;
    if (a = b / 100)  *out++ = a + '0';
    if (a = (b %= 100) / 10)  *out++ = a + '0';
    *out++ = b % 10 + '0';
    *out++ = ' ';
    }

  out[-(out != mem)] = '\0';
  puts(mem);

  free(mem);
  return 0;
  }


int main(int argc, char *argv[])
  {
  return fn(argv[argc > 1]);
  }

nobody ★★
()
Ответ на: комментарий от nobody

Спасибо! Пока пытаюсь вставить все это дело в xs.

vilfred ☆☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.