powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / word [Bit 0]...[Bit 15]. Как мне из этого 2 байта сфабриковать?
13 сообщений из 13, страница 1 из 1
word [Bit 0]...[Bit 15]. Как мне из этого 2 байта сфабриковать?
    #37813235
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вот так:
Код: plaintext
1.
2.
3.
B3 Configuration for B3 protocol 4: T.30 for Group 3 fax:
Resolution word 0: Standard
                1: High



то два байта пишутся:
Код: plaintext
1.
2.
      m_Bprotocol[17]=1; //1: High
      m_Bprotocol[18]=0;


либо
Код: plaintext
1.
2.
      m_Bprotocol[17]=0; //0: Standard
      m_Bprotocol[18]=0;


А если вот так?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
B3 Configuration for B3 protocol 5: T.30 for Group 3 fax extended:
Options word [Bit 0] : Enable high resolution
             [Bit 1] : Accept incoming fax-polling requests
             [Bit 10]: Enable JPEG negotiation (continuous-tone color mode according to T.4 Annex E) (see note 1)
             [Bit 11]: Enable JBIG color and gray-scale negotiation according to T.43 (see note 1)
             [Bit 12]: Do not use JBIG progressive bi-level image compression
             [Bit 13]: Do not use MR compression
             [Bit 14]: Do not use MMR compression
             [Bit 15]: Do not use ECM



Меня интересует
[Bit 0] : Enable high resolution yes/no
[Bit 15]: Do not use ECM yes/no

Код: plaintext
1.
2.
      m_Bprotocol[17]=???;
      m_Bprotocol[18]=???;



Я туплю, дайте мне формулу без объяснения что такое биты и байты. Когда-то русские смс-ки умел кодировать, а счас чего-то отупел.

P.S Сорри, могу переписать этот "код" на VB, мозги плавятся не от этого.
...
Рейтинг: 0 / 0
word [Bit 0]...[Bit 15]. Как мне из этого 2 байта сфабриковать?
    #37813237
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, подозрение такое:

high resolution (yes) = 2 ^ 0 = 1
Do not use ECM (no) = 2 ^ 15 = 32768

Тогда:
1) ECM + HI = 0+1=1
Код: plaintext
1.
2.
m_Bprotocol[17]=1;
m_Bprotocol[18]=0;


2) ECM + NOT(HI) =0+0=0
Код: plaintext
1.
2.
m_Bprotocol[17]=0;
m_Bprotocol[18]=0;


3) NOT(ECM) + NOT(HI) = 32768+0=32768
Код: plaintext
1.
2.
m_Bprotocol[17]=0;
m_Bprotocol[18]=128;


4) NOT(ECM) + HI = 32768+1=32769
Код: plaintext
1.
2.
m_Bprotocol[17]=1;
m_Bprotocol[18]=128;



Итого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
if (HI)
  m_Bprotocol[17]=1;
else
  m_Bprotocol[17]=0;
if (ECM)
  m_Bprotocol[18]=0;
else
  m_Bprotocol[18]=128;


Осталось проверить теорию на практике.
...
Рейтинг: 0 / 0
word [Bit 0]...[Bit 15]. Как мне из этого 2 байта сфабриковать?
    #37818425
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, предыдущая теория работает.

А как имея 2 байта получить bit[0] и bit[15] (обратная задача).

Т.е. вычислили байтовые составляющие WORD
Код: plaintext
1.
2.
m_byte[n] =x;
m_byte[n+1] =y;


Надо понять, чему равен bit[0] и bit[15].
Если предполагать, что все остальные биты нулевые, то обратная формула конечно верна.
А если не нулевые (MR, MMR)?

Как вычислить
Код: vbnet
1.
function GetBit (bitnumber, x, y) As Boolean


(в общем случае когда любой бит может быть ненулевой)
(Язык VB/C++ мне счас не важен, туплю с пониманием и арифметикой).
...
Рейтинг: 0 / 0
word [Bit 0]...[Bit 15]. Как мне из этого 2 байта сфабриковать?
    #37818453
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
Private Function GetBit(l As Long, Bit As Long) As Boolean

   GetBit = ((l And 2 ^ Bit) > 0)

End Function



посмотри
...
Рейтинг: 0 / 0
word [Bit 0]...[Bit 15]. Как мне из этого 2 байта сфабриковать?
    #37818466
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,
Посмотрю позже.

l=x+y*256 так?

А как это на C(++) записать?
...
Рейтинг: 0 / 0
word [Bit 0]...[Bit 15]. Как мне из этого 2 байта сфабриковать?
    #37818490
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
'15 bit в X - проверка на 1
Debug.Print GetBit(X, 15)
...
Рейтинг: 0 / 0
word [Bit 0]...[Bit 15]. Как мне из этого 2 байта сфабриковать?
    #37818806
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77l=x+y*256 так?
Дык а в чем я неправ?

Код: vbnet
1.
2.
3.
4.
5.
6.
Public Function GetBitXY(x As Long, y As Long, Bit As Long) As Boolean
    'WORD - 2 байта x - первый байт (0-255) y - второй байт (0-255)
   Dim l As Long
   l = x + y * 256
   GetBitXY = ((l And 2 ^ Bit) > 0)
End Function


На входе я всегда имею 2 байта сырой информации, а не long.
Мне их надо декодировать, получив в моем случае bit[0] и bit[15] (согласно спецификации что в начале поста).
Ну, вроде все работает:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
print getbitxy(1,128,15)
True
print getbitxy(1,128,0)
True
print getbitxy(0,128,15)
True
print getbitxy(0,128,0)
False
print getbitxy(1,0,15)
False
print getbitxy(1,0,0)
True
print getbitxy(0,0,15)
False
print getbitxy(0,0,0)
False



В более сложных случаях тоже:
Код: vbnet
1.
2.
3.
4.
print getbitxy(3,128,0)//bit[0]=1;bit[1]=1
True
print getbitxy(2,128,0)//bit[0]=0;bit[1]=1
False



А на си так? Как там степень пишется?
Код: plaintext
1.
GetBit = ((l && 2 ^ Bit) > 0)
...
Рейтинг: 0 / 0
word [Bit 0]...[Bit 15]. Как мне из этого 2 байта сфабриковать?
    #37818891
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Дмитрий77
> А на си так? Как там степень пишется?

В c есть операции сдвига .
...
Рейтинг: 0 / 0
word [Bit 0]...[Bit 15]. Как мне из этого 2 байта сфабриковать?
    #37820165
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотищаВ c есть операции сдвига .
ОЙ. А не можете в явном виде написать как это будет применительно к моему случаю? Sorry (что так паразитирую), да еще в в VB-ветке форума.
...
Рейтинг: 0 / 0
word [Bit 0]...[Bit 15]. Как мне из этого 2 байта сфабриковать?
    #37820370
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий77,
на c/c++ не пишу, - синтаксис/типы параметров могут быть "немного не такими".
Код: plaintext
1.
2.
3.
4.
5.
// ! контроль переполнения при сдвиге влево - на совести вызывающего
bool CheckBit(DWORD dwNumber, int iBit)
{
    return ( (dwNumber & (1 << iBit)) != 0 );
}
...
Рейтинг: 0 / 0
word [Bit 0]...[Bit 15]. Как мне из этого 2 байта сфабриковать?
    #37820541
Здесь вполне уместен LUT (lookup table) - массив с элементами-степенями двойки.
...
Рейтинг: 0 / 0
word [Bit 0]...[Bit 15]. Как мне из этого 2 байта сфабриковать?
    #37820725
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотищаДмитрий77,
на c/c++ не пишу, - синтаксис/типы параметров могут быть "немного не такими".
Код: plaintext
1.
2.
3.
4.
5.
// ! контроль переполнения при сдвиге влево - на совести вызывающего
bool CheckBit(DWORD dwNumber, int iBit)
{
    return ( (dwNumber & (1 << iBit)) != 0 );
}


Да, спасибо. Смысл вашего C-варианта (как и впрочем VB-шной Private Function GetBit от Konst_One) у меня понять честно говоря мозгов не хватает, но тем не менее то что я по мотивам всего накалякал:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
...
PString reason;
...
// Options (word) [Bit 15]: This is not an ECM connection
reason << "Error Correction=" << 
  !((((int)message.param.disconnect_b3_ind.m_NCPIData[4] * 256 +
  (int)message.param.disconnect_b3_ind.m_NCPIData[3]) & (1 << 15)) != 0) << '\n';
// Options (word) [Bit 0]: Enable high resolution
reason << "High Resolution=" << 
  ((((int)message.param.disconnect_b3_ind.m_NCPIData[4] * 256 +
  (int)message.param.disconnect_b3_ind.m_NCPIData[3]) & (1 << 0)) != 0) << '\n';
...


выдает результаты, соответствующие тому что вижу при тестах и прочим логам.

А уверены что & а не &&, в кодах чаще двойной амперсанд встречается?
...
Рейтинг: 0 / 0
word [Bit 0]...[Bit 15]. Как мне из этого 2 байта сфабриковать?
    #37820757
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Дмитрий77
> А уверены что & а не &&, в кодах чаще двойной амперсанд встречается?

Уверен.
Сравнение операторов в разных языках
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / word [Bit 0]...[Bit 15]. Как мне из этого 2 байта сфабриковать?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]