Помогите с BCD
От: Smooky Россия  
Дата: 26.09.06 18:17
Оценка:
Просмотрел по этмоу вопросу в форуме, ничего конкретного...
Есть телефонный номер из 15 цифр
char sz[16] = "123456789012345";
BYTE cb[8] = {0};
надо чтобы в cb было: младшие 4-ре бита первого байта — это цифра 1, старшие 4-ре бита — это 2-ая цифра, младшие 4-ре бита второго байта — это 3-я цифра и т.д.
т.е. каждый полубайт — это цифра десятичная от 0 до 9
void A2BCD(const char* psz, unsigned char* cb)
{
const char* src = psz;
unsigned char* dst = cb;
int len = strlen(psz);

for (int i = 0; i < len; i += 2) {
*dst = (*(src++) << 4) & 0xF0;
*(dst++) |= (*(src++) & 0x0F);
}
}
void BCD2A(unsigned char* cb, char* psz)
{
char* dst = psz;
unsigned char* src = cb;
int len = sizeof(cb);

for (int i = 0; i < 7; i++) {
*(dst++) = *src >> 4;
*(dst++) = *(src++) & 0x0F;
}
}

чот не работает! хотя в BCD помоему правильно, а вот вторая функция косячит
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re: Помогите с BCD
От: ZAVRus Украина  
Дата: 26.09.06 19:13
Оценка:
Здравствуйте, Smooky, Вы писали:

S>Просмотрел по этмоу вопросу в форуме, ничего конкретного...

S>Есть телефонный номер из 15 цифр
S>char sz[16] = "123456789012345";
S>BYTE cb[8] = {0};
S>надо чтобы в cb было: младшие 4-ре бита первого байта — это цифра 1, старшие 4-ре бита — это 2-ая цифра, младшие 4-ре бита второго байта — это 3-я цифра и т.д.
S>т.е. каждый полубайт — это цифра десятичная от 0 до 9
S>void A2BCD(const char* psz, unsigned char* cb)
S>{
S> const char* src = psz;
S> unsigned char* dst = cb;
S> int len = strlen(psz);

S> for (int i = 0; i < len; i += 2) {

S> *dst = (*(src++) << 4) & 0xF0;
S> *(dst++) |= (*(src++) & 0x0F);
S> }
S>}

По поводу A2BCD. Зачем & 0xF0, после << 4 заполенение идёт нулями.

S>void BCD2A(unsigned char* cb, char* psz)

S>{
S> char* dst = psz;
S> unsigned char* src = cb;
S> int len = sizeof(cb);

S> for (int i = 0; i < 7; i++) {

S> *(dst++) = *src >> 4;
S> *(dst++) = *(src++) & 0x0F;
S> }
S>}

S>чот не работает! хотя в BCD помоему правильно, а вот вторая функция косячит

А в чём собственно косяк? Или ты хотел получить обратно тоже самое что было до преобразования?
Дак ведь старшую часть ты обрезал. Т.е. у тебя в начале были символы числа, а после преобразования получились просто числа и к символам их надо дополнить
Re[2]: Помогите с BCD
От: Smooky Россия  
Дата: 27.09.06 03:14
Оценка:
Здравствуйте, ZAVRus, Вы писали:

ZAV>Здравствуйте, Smooky, Вы писали:


S>>Просмотрел по этмоу вопросу в форуме, ничего конкретного...

S>>Есть телефонный номер из 15 цифр
S>>char sz[16] = "123456789012345";
S>>BYTE cb[8] = {0};
S>>надо чтобы в cb было: младшие 4-ре бита первого байта — это цифра 1, старшие 4-ре бита — это 2-ая цифра, младшие 4-ре бита второго байта — это 3-я цифра и т.д.
S>>т.е. каждый полубайт — это цифра десятичная от 0 до 9
S>>void A2BCD(const char* psz, unsigned char* cb)
S>>{
S>> const char* src = psz;
S>> unsigned char* dst = cb;
S>> int len = strlen(psz);

S>> for (int i = 0; i < len; i += 2) {

S>> *dst = (*(src++) << 4) & 0xF0;
S>> *(dst++) |= (*(src++) & 0x0F);
S>> }
S>>}

ZAV>По поводу A2BCD. Зачем & 0xF0, после << 4 заполенение идёт нулями.


S>>void BCD2A(unsigned char* cb, char* psz)

S>>{
S>> char* dst = psz;
S>> unsigned char* src = cb;
S>> int len = sizeof(cb);

S>> for (int i = 0; i < 7; i++) {

S>> *(dst++) = *src >> 4;
S>> *(dst++) = *(src++) & 0x0F;
S>> }
S>>}

S>>чот не работает! хотя в BCD помоему правильно, а вот вторая функция косячит

ZAV>А в чём собственно косяк? Или ты хотел получить обратно тоже самое что было до преобразования?
ZAV>Дак ведь старшую часть ты обрезал. Т.е. у тебя в начале были символы числа, а после преобразования получились просто числа и к символам их надо дополнить

В A2BCD &F0 потому что сначала записываем младшие 4-ре бита, в след. строке старшие...
Ну да, и хотелось бы обратно из BCD получить туже самую ASCII строку... И как это сделать?
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[3]: Помогите с BCD
От: ZAVRus Украина  
Дата: 27.09.06 06:17
Оценка:
Здравствуйте, Smooky, Вы писали:

S>>>Просмотрел по этмоу вопросу в форуме, ничего конкретного...

S>>>Есть телефонный номер из 15 цифр
S>>>char sz[16] = "123456789012345";
S>>>BYTE cb[8] = {0};
S>>>надо чтобы в cb было: младшие 4-ре бита первого байта — это цифра 1, старшие 4-ре бита — это 2-ая цифра, младшие 4-ре бита второго байта — это 3-я цифра и т.д.
S>>>т.е. каждый полубайт — это цифра десятичная от 0 до 9
S>>>void A2BCD(const char* psz, unsigned char* cb)
S>>>{
S>>> const char* src = psz;
S>>> unsigned char* dst = cb;
S>>> int len = strlen(psz);

S>>> for (int i = 0; i < len; i += 2) {

S>>> *dst = (*(src++) << 4) & 0xF0;
S>>> *(dst++) |= (*(src++) & 0x0F);
S>>> }
S>>>}

ZAV>>По поводу A2BCD. Зачем & 0xF0, после << 4 заполенение идёт нулями.

S>В A2BCD &F0 потому что сначала записываем младшие 4-ре бита, в след. строке старшие...
ну скорее наоборот сначала старшую, затем младшую: & 0xF0 — младшую обнулил, не надо, лишнее,
ну если сильно хочеться, то пожалуйста.

S>Ну да, и хотелось бы обратно из BCD получить туже самую ASCII строку... И как это сделать?

110000 = 0 .. 111001 = 9. вот как раз эти старшие 2-а бита мы теряем. т.е BCD2A:
void BCD2A(unsigned char* cb, char* psz)
{
    char* dst = psz;
    unsigned char* src = cb;
    int len = sizeof(cb);

    for (int i = 0; i < len; i++) {
        *(dst++) = *src >> 4;
        *(dst++) = *(src++) & 0x0F | 0x30;
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.