Консультация № 77185
28.02.2007, 18:17
0.00 руб.
0 5 5
Спаибо всем за предыдущую справку!
Вопрос:
Напишите подробнее про переменную типа BYTE эта переменная может хранить инфу размером в один байт или как?
Допустим у меня есть целочисленный массив из разных значения типа 111010101 могу-ли я присвоить значения этого массива переменной типа BYTE и как присваивать ведь один байт это 8 бит т.е. в одну переменную типа BYTE поместится 10101010 или нет?
Как в байте выставить нужные биты?
И еще одно 8-)
У меня есть переменная типа char mass[]="10010101" как мне записать эту битовую строчку в фаил и как считать её потом, или надо использовать int b=10010101? заранее спасибо/

Обсуждение

Неизвестный
28.02.2007, 18:29
общий
это ответ
Здравствуйте, Tatarin!
байт это 8 бит. Иначе BYTE = unsigned char.
запись константы может быть в бинарной или десятичной форме. можно записать
unsigned char A = 11101010b; или
unsigned char A = 234;
unsigned char A = 0xEA; в шестнадцатеричной форме.

для того чтоб записать строчку в файл надо использовать обычный интерфейс типа write(), fwrite(), FileWrite() etc. Чтобы превратить строчку с числом в число можно пользоваться функциями sscanf(), atoi().

если вы хотите выставить бит N в байте в 1, то воспользуйтесь операцией
unsigned char A;
A = A|(1<<N);
если вы хотите выставить бит N в байте в 0, то воспользуйтесь операцией
A = A&(0xFE<<N);

Неизвестный
28.02.2007, 18:49
общий
это ответ
Здравствуйте, Tatarin!
int b=10010101 - это десятичная запись, поэтому битовое представление b будет уже другим(00000000100110001011110111110101). Точно так же обстоят дела и с char mass[]="10010101".Только битовая версия строки будет совокупностью байт, соответствцющих ASCII-кодам символов ‘0‘ и ‘1‘, которые соответственно равны десятичным цифрам 48 и 49. Если у вас есть реальная битовая строка, которая в последствии не будет меняться, то быстрее всего будет разбить эту последовательность на блоки, размерностью по 64,32,16 или 8 бит, забить эти блоки в калькулятор, перевести их в десятичное представление, и уже манипулировать в программе десятичными числами.

Размер блока - выбирайте на свое усмотрение, но ТИП, используемый для хранения соответвтвующих десятичных чисел должен соответствовать следующим отношениям:

Для 64 битных блоков, используйте целочисленный тип __int64 или LONGLONG
Для 32 битных блоков, используйте целочисленный тип DWORD или ULONG
Для 16 битных блоков, используйте целочисленный тип WORD
Для 8 битных блоков, используйте целочисленный тип BYTE

BYTE - это тот же char, только без знака, т.е. unsigned char

Метод, который я привел предыдущим сообщением как раз и выставляет заданный бит в байте.
Неизвестный
28.02.2007, 19:18
общий
это ответ
Здравствуйте, Tatarin!
В С/С++ переменная размером в 8 бит это char. Она может принимать значения -127..127. Аналог паскалевского byte это unsigned char (т.е. беззнаковый). Заметьте, что char - это не символ, это целый тип. Что бы присвоить такой переменной значение char mass[]="10010101" нужно перевести это число в десятичное значение.

Приложение:
#include <string.h>#define byte unsigned charbyte FromStringToByte(char str[]){ byte value = 0; int k = 1; for (int i = (int)strlen(str) - 1; i >=0 ; i--) { if (str[i] == ‘1‘) { value += k; } k <<= 1; } return value;}int main(){ byte b = FromStringToByte("10010101");//После выполнения этой строки b станет равным 149. return 0;}
Неизвестный
28.02.2007, 20:40
общий
это ответ
Здравствуйте, Tatarin!
Да - переменная типа BYTE может содержать
инфу в один байт.
Нет не можешь. Тип int в Win32 занимает 4-ре байта.
А значения из четырех байт не поместиться в один байт, а
тем более массив!!!
Биты в байте выставляются с помощью масок и операций &, ~ и |.
Почитать можно в любом учебнике по C.
Чтобы записать строку char mass[]="10010101"
в переменную BYTE b см.приложение.
Удачи!



Приложение:
BYTE b=0;for(int i=0;i<strlen(mass);i++){ b<<=1; if(mass[i]==‘1‘) b|=1;}
Неизвестный
01.03.2007, 02:12
общий
это ответ
Здравствуйте, Tatarin!

Считаю своим долгом объяснить, почему предыдущие эксперты использовали тип unsigned char в качестве одного байта.
Любой тип данных в языке C имеет свою размерность:
char,bool - 1 байт
short - 2 байта
long,float,int - 4 байта
long double,double - 8 байт
Т.е. , как ты видишь, типы переменных одной и той же размерности могут хранить данные различного типа, разница лишь в том, как эти байты интерпретируются.
Теперь насчет "типа" BYTE. В одном из заголовочных файлов находится строчка:
typedef unsigned char BYTE;
Т.е. BYTE = unsigned char

Конечно, массив в один байт не поместится, но можно выставить биты в нем в соответствии с числами в массиве, например так:

BYTE b;
char m[]="10010001";

for (int i=0; i<8; i++)
{
mas[i]-=48;
b<<=1;//сдвигаем биты влево на 1
if (m[i]) b|=1; else b&=254;

}

число 1 в двоичном виде 00000001, зн. операция x|=1 установит последний бит в 1
число 254 - это 11111110, зн. x&=254 установит последний бит в 0
Форма ответа