ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

массив байтов, C/c++
  #1  
Старый 03.03.2008, 02:20
Аватар для байкал
байкал
Новичок
Регистрация: 01.08.2007
Сообщений: 24
Провел на форуме:
48533

Репутация: 1
По умолчанию массив байтов, C/c++

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

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

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

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

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

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

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

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

Последний раз редактировалось байкал; 03.03.2008 в 03:13..
 
Ответить с цитированием

  #2  
Старый 03.03.2008, 04:34
Аватар для KEZ
KEZ
Banned
Регистрация: 18.05.2005
Сообщений: 1,981
Провел на форуме:
1941233

Репутация: 2726


По умолчанию

Уу...

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

  #3  
Старый 03.03.2008, 05:09
Аватар для байкал
байкал
Новичок
Регистрация: 01.08.2007
Сообщений: 24
Провел на форуме:
48533

Репутация: 1
По умолчанию

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

  #4  
Старый 03.03.2008, 08:30
Аватар для nerezus
nerezus
Pagan Heart
Регистрация: 12.08.2004
Сообщений: 3,791
Провел на форуме:
6490435

Репутация: 2290


Отправить сообщение для nerezus с помощью ICQ
По умолчанию

Никак.
 
Ответить с цитированием

  #5  
Старый 03.03.2008, 09:51
Аватар для байкал
байкал
Новичок
Регистрация: 01.08.2007
Сообщений: 24
Провел на форуме:
48533

Репутация: 1
По умолчанию

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

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

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

  #6  
Старый 03.03.2008, 13:25
Аватар для байкал
байкал
Новичок
Регистрация: 01.08.2007
Сообщений: 24
Провел на форуме:
48533

Репутация: 1
По умолчанию

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

  #7  
Старый 03.03.2008, 21:55
Аватар для Forcer
Forcer
Постоянный
Регистрация: 12.04.2007
Сообщений: 413
Провел на форуме:
3578578

Репутация: 275
Отправить сообщение для Forcer с помощью ICQ
По умолчанию

Если я правильно понял, то у тебя есть адрес первого элемента в массиве/буфере. Тебе нужно узнать его тип. Тип будет известен только на стадии выполнения, так? В таком случае нужно использовать RTTI и оператор typeid. Вот элементарный пример использования:
Код:
#include <iostream>
int main()
{
	int a = 5;
	std::cout << typeid(a).name() << std::endl;
	return 0;
}
 
Ответить с цитированием

  #8  
Старый 03.03.2008, 22:10
Аватар для desTiny
desTiny
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
Провел на форуме:
3008839

Репутация: 1502


По умолчанию

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

H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ
 
Ответить с цитированием

  #9  
Старый 03.03.2008, 22:21
Аватар для Forcer
Forcer
Постоянный
Регистрация: 12.04.2007
Сообщений: 413
Провел на форуме:
3578578

Репутация: 275
Отправить сообщение для Forcer с помощью ICQ
По умолчанию

desTiny
ТС написал:
Цитата:
У меня только адрес первой записи с которой я могу начать читать.
Этого достаточно чтобы определить тип.
 
Ответить с цитированием

  #10  
Старый 03.03.2008, 22:27
Аватар для desTiny
desTiny
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
Провел на форуме:
3008839

Репутация: 1502


По умолчанию

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

И скажи тогда мне, что это - инт или дабл?
__________________
Bedankt euch dafür bei euch selbst.

H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как Вы бьёте Raid массив? -=lebed=- Аппаратное обеспечение 17 25.01.2010 19:46
Raid, Scsi Cthulchu Аппаратное обеспечение 5 22.11.2008 16:45



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ