массив байтов, C/c++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by байкал, 3 Mar 2008.

  1. байкал

    байкал New Member

    Joined:
    1 Aug 2007
    Messages:
    24
    Likes Received:
    0
    Reputations:
    0
    Я читаю данные из массива/буфера с байтами.

    Сам массив начинается с цифр. Потом идёт или текст, или binary.

    В цифрах закодирована информация что именно содержит этот буфер/массив. У меня только адрес первой записи с которой я могу начать читать.

    Если вначале идёт uint, потом double, то массив содержит текст. А если вначале double, потом uint, то массив содержит binary.

    буфер с текстом
    -----------------------------------------------
    заголовок | текст
    uint double | antichat...

    буфер с binary
    -----------------------------------------------
    заголовок | данные
    double uint | 1010101

    Как можно узнать, когда был прочитан uint и когда был прочитан double?
    (Я думал просто написать if(!(cin >> uint)) или использовать "|" оператор, но не уверен что это сработает. Вообще я с байтами не работал раньше.)

    Или, как вообще узнать, что содержит буфер: ASCII или binary?
     
    #1 байкал, 3 Mar 2008
    Last edited: 3 Mar 2008
  2. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Уу...

    Как узнать, что содержит ведро с водой - атомы или молекулы ?
    Так же и тут, рассматривать буфер можно и как двоичный и как любой другой.
    А про cin>>uint это полный бред и естественно все неверно.
     
  3. байкал

    байкал New Member

    Joined:
    1 Aug 2007
    Messages:
    24
    Likes Received:
    0
    Reputations:
    0
    По идее в uint первый (знаковый) бит должен быть единица, но я не уверен.
     
  4. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Никак.
     
    1 person likes this.
  5. байкал

    байкал New Member

    Joined:
    1 Aug 2007
    Messages:
    24
    Likes Received:
    0
    Reputations:
    0
    Ну если все байты начинаются с нуля, можно с большой вероятностью предположить, что это ASCII. Но это решение некрасивое.

    Мне надо сделать заключение из заголовка. В том формате, с которым я имею дело, если буфер начинается с unsigned int то он содержит binary, а если с double, то он содержит ASCII.

    Весь вопрос в том, как узнать был прочитан unsigned int или double.
    Я думаю надо бит флаги использовать.
     
  6. байкал

    байкал New Member

    Joined:
    1 Aug 2007
    Messages:
    24
    Likes Received:
    0
    Reputations:
    0
    Я нашёл функцию, которая показывает относиться ли байт к Ascii или нет. Если все байты в массиве Ascii, то и весь массив тоже Ascii (чем больше байтов, тем больше вероятность).
    Этот заголовок в начале буфера только внимание отвлекал.
     
  7. Forcer

    Forcer Elder - Старейшина

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    Если я правильно понял, то у тебя есть адрес первого элемента в массиве/буфере. Тебе нужно узнать его тип. Тип будет известен только на стадии выполнения, так? В таком случае нужно использовать RTTI и оператор typeid. Вот элементарный пример использования:
    Code:
    #include <iostream>
    int main()
    {
    	int a = 5;
    	std::cout << typeid(a).name() << std::endl;
    	return 0;
    }
     
  8. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    Forcer, а как, прости меня, можно определить является ли данная последовательность бит представлением uint'a или double'а? По-моему, никак, ибо размер памяти >> размера uint'a и double'а =) То есть, иначе говоря, задача изоморфна такой: "Дано число 101. Определить систему счисления." И как её решать? nerezus прав.
     
  9. Forcer

    Forcer Elder - Старейшина

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    desTiny
    ТС написал:
    Этого достаточно чтобы определить тип.
     
  10. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    Forcer,
    Ну круто: тебе говорят число n. В памяти с адреса n записаны биты:
    10001111011000100101101001010111000...

    И скажи тогда мне, что это - инт или дабл? :)
     
  11. Forcer

    Forcer Elder - Старейшина

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    всё, понял. был неправ. спасибо за объяснение.