Форум программистов, компьютерный форум, киберфорум
Pure Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
2 / 2 / 0
Регистрация: 23.04.2012
Сообщений: 18

Изменить рандомный бит в байте

04.05.2012, 00:17. Показов 2298. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Подскажите пожалуйста, как сменить рендомный бит в считанном из файла байте? На другом языке обычно строка - это массив чаров, можно было перегнать байт в битовую строку, дополненную нулями, и изменить битик, но в pb ведь не сделаешь что-то вроде temp$(4)="1" (четвертый символ сменить на "1"), или я не прав? Ещё была мысль как-нибудь прикрутить xor, но с битовыми операциями опыт маловат, не разобрался... Путанно объясняюсь, извиняюсь. Спасибо за внимание.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.05.2012, 00:17
Ответы с готовыми решениями:

В байте не восемь бит.
Мне знакомый показал статейку следующего вида: Внимание! Путаница в терминологии. Читать всем! zaff » 14 авг 2009, 18:09 ...

Поменять порядок бит в байте
Есть некий байт, необходимо порядок его первых 3х бит поменять на обратный! Подскажите Добавлено через 6 минут По сути надо 0 и 2...

Порядок байт в слове и бит в байте
читал эту требуются пояснения. A B C D - адреса в них число 128 BE A B C D ...

5
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
04.05.2012, 05:12
Dartess, это не так сложно как кажется.

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
  MyFile = ReadFile (#PB_Any, "TestFile.txt")        ;  Открыть файл
 
      BitNumber = 7    ; Номер бита который надо изменить (0 ... 7)
 
      MaskByte.a = Pow(2, BitNumber)        ;  В маске нужный бит будет степенью двойки
         Debug "Маска :" + Str(MaskByte)
 
      MyByte.a = ReadByte(MyFile)           ;  Прочитаем байт из файла
 
         Debug "Значение до изменения бита   : " + Str(MyByte)
      NewByte.a = MyByte ! MaskByte         ;  Делаем побитовый XOR
         Debug "Значение после изменения бита: " + Str(NewByte)
  CloseFile(MyFile)        ;  Закрыть файл
Булеву алгебру коротко на пальцах объяснить не получится, почитайте учебник.
Вам нужно знать: что такое бит, каким образом любая совокупность бит
преобразуется в число и наоборот, таблицы "истинности" булевых функций:
OR, AND, XOR. Тогда вы поймёте, как в действительности это всё работает.

На ассемблере есть специальные инструкции для работы с битами, крайне
рекомендую ознакомиться.
http://asmworld.ru/spravochnik-komand/btc/
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
04.05.2012, 08:09
Цитата Сообщение от Dartess Посмотреть сообщение
На другом языке обычно строка - это массив чаров, можно было перегнать байт в битовую строку, дополненную нулями, и изменить битик, но в pb ведь не сделаешь что-то вроде temp$(4)="1" (четвертый символ сменить на "1"), или я не прав?
Можно сделать подобное
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
; Считали байт
a.w=$FF
Debug Bin(a)
; загнали побитно в массив
Dim Temp.s(7)
For i=0 To 7
  Temp(i)=Mid(Bin(a),i,1)
Next
; заменили пятый бит
Temp(5)="0"
; из массива в строку
For i=0 To 7
  temp$+Temp(i)
Next
; смотрим результат - новый байт
Debug temp$
Debug Hex(Val("%"+temp$))
0
2 / 2 / 0
Регистрация: 23.04.2012
Сообщений: 18
04.05.2012, 09:36  [ТС]
С булевой алгеброй более-менее знаком, не первый год в универе... Просто опыта общения в программировании с ней не было.

За ссылку отдельное спасибо Обычно если нужен асм, тыркаю знакомого, который только на нем пишет... Вот и вчера уже после компа пристал к нему. Он выдал следующую конструкцию:
Assembler
1
2
3
4
5
invoke Random 0, 7
mov ecx, eax
mov al, 1
shl al, cl
xor dl, al
Уж не знаю, насколько правильно (он тоже не проверял), но суть он мне пояснил, а я постарался адаптировать её к PB (ну и целям, которые мне нужны) и получил что-то вроде
PureBasic
1
2
3
4
5
6
7
If ReadFile(0,"spa.txt")
  If CreateFile(1,"spa_test.txt")
    While Eof(0)=0
        WriteAsciiCharacter(1, ReadAsciiCharacter(0) ! (1 << (Random(7))))
    Wend
  EndIf
EndIf
Вроде работает Вечером подробнее посмотрю Ваши варианты, но так сделать можно? Кстати, за "подобное" тоже отдельное спасибо)
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
04.05.2012, 10:26
но так сделать можно?
Думаю да, а в чём цель? Вы разрабатываете алгоритм восстановления данных
и хотите искусственно покоцать файл?
0
2 / 2 / 0
Регистрация: 23.04.2012
Сообщений: 18
04.05.2012, 16:51  [ТС]
>Quiet Snow<, да) только не разрабатываю, а реализую алгоритм, который в универе объясняли. Выбор языка на этом предмете свободный, мне чем-то нравится PB)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.05.2012, 16:51
Помогаю со студенческими работами здесь

Написать функцию, меняющую порядок бит в байте
написать функцию, меняющую порядок бит в байте. заранее спасибо

Создать функцию, которая бы возвращала кол-во бит в переданном ей байте
Создать ФУНКЦИЮ которой возвращает кол-во бит переданном его в байте. function bitcut(x:byte):byte;

Как изменить рандомный на последовательный вывод сообщений?
Код выводит имена рандомно, но нужно чтобы они выводились по порядку. Буду очень признателен, если кто-то покажет что на что надо...

Сколько чисел в начальном байте содержит наименьшее значение а в старшем байте наибольшее значение
сколько чисел в начальном байте содержит наименьшее значение (эта строчка) а в старшем байте наибольшее значение (эта строчка) ...

Изменить 1 бит для того, чтобы последняя инструкция положила в стек 0x126
Изменить 1 бит для того, чтобы последняя инструкция положила в стек 0x126. 33ED xor ebp, ebp B82A020000 mov eax, 00000022Ah ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru