Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   массив байтов, C/c++ (https://forum.antichat.xyz/showthread.php?t=63298)

байкал 03.03.2008 02:20

массив байтов, C/c++
 
Я читаю данные из массива/буфера с байтами.

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

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

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

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

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

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

Или, как вообще узнать, что содержит буфер: ASCII или binary?

KEZ 03.03.2008 04:34

Уу...

Цитата:

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

байкал 03.03.2008 05:09

По идее в uint первый (знаковый) бит должен быть единица, но я не уверен.

nerezus 03.03.2008 08:30

Никак.

байкал 03.03.2008 09:51

Цитата:

Сообщение от nerezus
Никак.

Ну если все байты начинаются с нуля, можно с большой вероятностью предположить, что это ASCII. Но это решение некрасивое.

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

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

байкал 03.03.2008 13:25

Я нашёл функцию, которая показывает относиться ли байт к Ascii или нет. Если все байты в массиве Ascii, то и весь массив тоже Ascii (чем больше байтов, тем больше вероятность).
Этот заголовок в начале буфера только внимание отвлекал.

Forcer 03.03.2008 21:55

Если я правильно понял, то у тебя есть адрес первого элемента в массиве/буфере. Тебе нужно узнать его тип. Тип будет известен только на стадии выполнения, так? В таком случае нужно использовать RTTI и оператор typeid. Вот элементарный пример использования:
Код:

#include <iostream>
int main()
{
        int a = 5;
        std::cout << typeid(a).name() << std::endl;
        return 0;
}


desTiny 03.03.2008 22:10

Forcer, а как, прости меня, можно определить является ли данная последовательность бит представлением uint'a или double'а? По-моему, никак, ибо размер памяти >> размера uint'a и double'а =) То есть, иначе говоря, задача изоморфна такой: "Дано число 101. Определить систему счисления." И как её решать? nerezus прав.

Forcer 03.03.2008 22:21

desTiny
ТС написал:
Цитата:

У меня только адрес первой записи с которой я могу начать читать.
Этого достаточно чтобы определить тип.

desTiny 03.03.2008 22:27

Forcer,
Ну круто: тебе говорят число n. В памяти с адреса n записаны биты:
10001111011000100101101001010111000...

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


Время: 04:16