Другое С/С++ Вопрос - Ответ

CarLCas

Известный
161
118
Вопрос чутка не по теме. Подскажите, пожалуйста, как можно из двоичного файла, состоящего из 01010010, считать только положительнбые числа? Заранее спасибо.
Считываешь комбинацию и проверяешь последний бит (самую первую цифру), если он равен 0 - положительное, если 1 - отрицательное
Положительные? А тут есть отрицательные?
Есть
 

Recovery

Известный
65
3
Считываешь комбинацию и проверяешь последний бит (самую первую цифру), если он равен 0 - положительное, если 1 - отрицательное

Есть

Тогда, поясните другой момент. Когда я считываю из файла любые числа и преобразую их 'FBnew.ReadInt32(); '
FBnew - это BinaryReader, т.е двоичный файл. Если я ввиду в файл - "1234", он мне выдаст "12849". Почему так, можете пояснить? Спасибо.

ИЛИ (в файле все то же '1234')
если я вывожу FBnew.ReadByte() (считывает 1 байт и передвигает позицию в потоке на 1 байт вперед). Выдает 49, откуда он берет эти числа? Можете пояснить?

// думал, что 49 - код числа в символах (48 - 0, 49 - 1), оказалось, что ошибся.
 
Последнее редактирование:

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,448
BinaryReader - не означает, что файл будет читаться в двоичной системе счисления. Он будет читаться побайтово, а не по строкам(как обычно).

// думал, что 49 - код числа в символах (48 - 0, 49 - 1), оказалось, что ошибся.
http://book.itep.ru/10/ascii.htm
49 - это ASCII код цифры(символа) "1".
 

Recovery

Известный
65
3
BinaryReader - не означает, что файл будет читаться в двоичной системе счисления. Он будет читаться побайтово, а не по строкам(как обычно).


http://book.itep.ru/10/ascii.htm
49 - это ASCII код цифры(символа) "1".

Т.е, если я считаю побайтово символ, он мне вернет код этого символа, али что?
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,448
Если в файле хранится следующий текст: Hello, world! , то считывание побайтово(по 1 байту) будут возвращаться значения: 72 101 108 108 111 44 32 119 111 114 108 100 33
 

Recovery

Известный
65
3
Если ли сайт с подробно расписанной теорией по работе с бинарными операциями C#? (В гугле ничего адекватного не нашел)
Большое спасибо, legend2360. Есть еще пару 'недо'понимание,
Если я указал мол BinaryReader FBnew = new BinardyReader(File), где File - двоичный файл. Чем различаются такие понятия, как FBnew.ReadInt16 и FBnew.ReadUInt16. Сама VS трактует это так : ReadInt16 - считывает целое число со знаком длиной 2 байта и перемещает текущую позицию потока на два байта вперед, ReadUInt16 - считывает целое число без знака длиной 2 байта в формате прямого порядка из текущего потока и перемещает текущую позицию потока на два байта вперед и ReadString - строка предваряется значением длины строки, которое закодировано как целое число блоками по 7 битов. Можно ли перевести это на русский лад? Блоками по 7 битов, простите, это что?)

Не понятно, что за число со знаком и число без знака. Оно же целое, какой может быть знак? (Он же только у вещественных).
А если считывать в длину 2 байта, я так понимаю это просто 2 байта - 2 символа из файла, т.е если в файле - "12345". Он считает 1(49) и 2(50)? И если указатель смещается на 4 байта вперед, то грубо говоря, перепрыгивает через 4 символа вперед? Мне нужно считать из файла побайтово число. Т.е если я применю Int16, то считаются только первые две цифры? (А если оно состоит из 4 цифр, то Int32, как быть если я не знаю количество цифр?)

п.с могу заблуждаться, но чтобы считать сразу 2 байта и более, нужно создать массив?
  • Машины с порядком хранения от старшего к младшему (прямой порядок) хранят старший байт первым. Если посмотреть на набор байтов, то первый байт (младший адрес) считается старшим
Не особо понятно формулировка данных слов, возможно ли пояснить это по полкам?
Заранее спасибо.
 
Последнее редактирование:

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,448
Int - integer - целое число(занимает 4 байта памяти), границы от ~ -2 млрд(~) до ~2 млрд.
Int16 - integer16(short или int16_t(что не могу подтвердить)) - целое число, но уже занимает 2 байта и имеет другие границы - меньше(-32 тыс. до 32 тыс.).
Приставка U(unsigned) обозначает, что число не может быть отрицательным и диапазон начинается от 0 до x*2+1(x - максимальный диапазон в "со знаком").
7 битов - это 0,875 байта, что по мною изученными типами данных не соответствует ни один(самый "менее потребляемый память" тип данных является bool / byte).

P.S. Было бы легче отвечать, если разделял вопросы по абзацам или нумеровал их.

Насчет разбиения чтения по 2 байтам и более ничего сказать не могу(как это будет возвращаться). Если прочитать 4 байта - в переменную занесутся эти 4 байта и указатель переместится так же на 4 байта.
Про машины(хранение младшего байта первым) могу объяснить(если я правильно понял) на HEX:
шестнадцатеричная система счисления(далее HEX) записывается так: 0xAAFF1230, т.е. 1 байт - 0xAA, 2 байт - 0xFF, 3 байт - 0x12, 4 байт - 0x30. В памяти они записываются наоборот: 0x3012FFAA.

Всё, что я здесь изъяснил, является опытом(он у меня не такой богатый) из клео(про побайтовое чтение). Это может не соответствовать действительности в C#.
 

NarutoUA

NarutoUA
BH Team
692
1,537
Тогда, поясните другой момент. Когда я считываю из файла любые числа и преобразую их 'FBnew.ReadInt32(); '
FBnew - это BinaryReader, т.е двоичный файл. Если я ввиду в файл - "1234", он мне выдаст "12849". Почему так, можете пояснить? Спасибо.

ИЛИ (в файле все то же '1234')
если я вывожу FBnew.ReadByte() (считывает 1 байт и передвигает позицию в потоке на 1 байт вперед). Выдает 49, откуда он берет эти числа? Можете пояснить?

// думал, что 49 - код числа в символах (48 - 0, 49 - 1), оказалось, что ошибся.
49 это и есть код символа ('1'). Если ты хочешь считать число из файла, можешь считать строку и преобразовать ее в инт (Int32.Parse(string))
И еще, бинарные операции это операции между двумя операндами (например 5 + 10, тут операнды 5 и 10, есть еще унарные и тернарная операторы)
У тебя в файле текстовые данные (тоесть число 123456 представлено как последовательность 6 байт-букв), прочитать через ReadInt32, ReadInt16, ReadByte (можно, но сложно) у тебя не получится. Чтобы прочитать число через эти функции нужно их записать бинарно.
 
Последнее редактирование:

Recovery

Известный
65
3
Уже не ожидал увидеть ответа, большое спасибо всем отзывчивым.
Еще один нюанс: в файле записано - "123456", при выводе стоит FBnew.ReadInt16(); т.е преобразует то что в файле в инт, и если по два байта то берет только "12", а выдает "12849". Откуда это число взялось? Я не пойму тогда, как же мне считать до конца число? Оно может состоять одно из десятки цифр, а я могу только считать только две, ну ладно четыре через ReadInt32. Не понятно. Считать по частям? С этим никогда не работал.

п.с мне нужно из двоичного файла считать все положительные, т.е в файле записано "0101001 101001". Выдать должен первое, я не пойму как это представляется в VS. То ли есть специальные операторы, которые сами это преобразуют, делать через строки, да, можно, но это достоаточно просто, тема состоит не в строках, а в работе с двоичными файлами, то бишь работать нужно через Binary или FileStream, сделаю так)

Попробую считывать побайтово, если первый равен 48, то записывай до пробела, если снова пробел, то проверяй 48(0) или 49(1))

записать бинарно.
Поподробнее можно?
 
Последнее редактирование:

return

Новичок
82
5
как в собе сделать чекер стрима по скинам?
крч говоря, если в стриме появляется скин с id 123, то это напишет в чекер.
 

Niko

Известный
Проверенный
230
268
Как вывести текст на экран? (Как print в CLEO)