Просмотрел по этмоу вопросу в форуме, ничего конкретного...
Есть телефонный номер из 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 помоему правильно, а вот вторая функция косячит
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Здравствуйте, 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 помоему правильно, а вот вторая функция косячит
А в чём собственно косяк? Или ты хотел получить обратно тоже самое что было до преобразования?
Дак ведь старшую часть ты обрезал. Т.е. у тебя в начале были символы числа, а после преобразования получились просто числа и к символам их надо дополнить
Здравствуйте, 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 строку... И как это сделать?
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Здравствуйте, 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;
}
}