Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Наоборот BCD и string / 19 сообщений из 19, страница 1 из 1
08.02.2007, 13:50
    #34315782
sax_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наоборот BCD и string
Есть функция получения строки из BCD
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
string BCDStr(unsigned char* buff, int first, int last) {
	unsigned char tmp[ 32 ];
	memset(tmp,  0 ,  32 );
        char _tmp[ 16 ];
	memset(_tmp,  0 ,  16 );

	for (int i = first; i < last; i++) {
                	itoa(buff[i] >>  4 , _tmp,  10 );
                	strncat((char*) tmp, _tmp,  16 );
                        itoa(buff[i] & 0xF, _tmp,  10 );
                	strncat((char*) tmp, _tmp,  16 );
                	}
	return string((char*) tmp);
}
Помогите её реализовать "наоборот", т.е. получить BCD из строки.
...
Рейтинг: 0 / 0
08.02.2007, 15:10
    #34316181
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наоборот BCD и string
sax_Есть функция получения строки из BCD
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
string BCDStr(unsigned char* buff, int first, int last) {
	unsigned char tmp[ 32 ];
	memset(tmp,  0 ,  32 );
        char _tmp[ 16 ];
	memset(_tmp,  0 ,  16 );

	for (int i = first; i < last; i++) {
                	itoa(buff[i] >>  4 , _tmp,  10 );
                	strncat((char*) tmp, _tmp,  16 );
                        itoa(buff[i] & 0xF, _tmp,  10 );
                	strncat((char*) tmp, _tmp,  16 );
                	}
	return string((char*) tmp);  // так делать  низзяяяя см. стороку 2 ( переменная создается в стеке )
}
Помогите её реализовать "наоборот", т.е. получить BCD из строки.



Это будет ISO8583 ?
...
Рейтинг: 0 / 0
08.02.2007, 15:13
    #34316202
sax_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наоборот BCD и string
onstat- sax_Есть функция получения строки из BCD
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
string BCDStr(unsigned char* buff, int first, int last) {
	unsigned char tmp[ 32 ];
	memset(tmp,  0 ,  32 );
        char _tmp[ 16 ];
	memset(_tmp,  0 ,  16 );

	for (int i = first; i < last; i++) {
                	itoa(buff[i] >>  4 , _tmp,  10 );
                	strncat((char*) tmp, _tmp,  16 );
                        itoa(buff[i] & 0xF, _tmp,  10 );
                	strncat((char*) tmp, _tmp,  16 );
                	}
	return string((char*) tmp);  // так делать  низзяяяя см. стороку 2 ( переменная создается в стеке )
}
Помогите её реализовать "наоборот", т.е. получить BCD из строки.
Это будет ISO8583 ?
Не понял!!! А как правильно?
...
Рейтинг: 0 / 0
08.02.2007, 15:34
    #34316297
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наоборот BCD и string
sax_ onstat- sax_Есть функция получения строки из BCD
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
string BCDStr(unsigned char* buff, int first, int last) {
	unsigned char tmp[ 32 ];
	memset(tmp,  0 ,  32 );
        char _tmp[ 16 ];
	memset(_tmp,  0 ,  16 );

	for (int i = first; i < last; i++) {
                	itoa(buff[i] >>  4 , _tmp,  10 );
                	strncat((char*) tmp, _tmp,  16 );
                        itoa(buff[i] & 0xF, _tmp,  10 );
                	strncat((char*) tmp, _tmp,  16 );
                	}
	return string((char*) tmp);  // так делать  низзяяяя см. стороку 2 ( переменная создается в стеке )
}
Помогите её реализовать "наоборот", т.е. получить BCD из строки.
Это будет ISO8583 ?
Не понял!!! А как правильно?

Правильно следить чтобы создание и удаление переменных
происходило на одном и том же уровне области видимости.

Другими словами если вы возвращаете указатель то память под данные
должна существовать до вызова функции которая его возвращает.

Как альтернатива, выделять память из кучи внутри функции ( но появится другая проблема, с которой вы столкнетесь при отлове утечки памяти).

В вашем случае после выполнения return переменная unsigned char tmp[32];
и память выделенная под нее прекратит свое существование.
И указатель станет невалидный.
Программа упадет тогда когда вы обратитесь по этому указателю
а эта память будет занята уже другими данными.

Так всетаки ISO8583 ?
...
Рейтинг: 0 / 0
08.02.2007, 15:39
    #34316321
sax_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наоборот BCD и string
onstat-Так всетаки ISO8583 ?
Что ISO8583? И при чем тут ISO8583?
...
Рейтинг: 0 / 0
08.02.2007, 15:41
    #34316338
sax_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наоборот BCD и string
А как тогда получше осуществить преобразование unsigned char* в string?
...
Рейтинг: 0 / 0
08.02.2007, 15:43
    #34316350
sax_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наоборот BCD и string
onstat- Пытаюсь запрогать самодельный USB device.
Так всетаки ISO8583 ?
...
Рейтинг: 0 / 0
08.02.2007, 15:43
    #34316351
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наоборот BCD и string
sax_ onstat-Так всетаки ISO8583 ?
Что ISO8583? И при чем тут ISO8583?

Я просто интересуюсь.
Функции по которым вы задаете вопросы последние 2 дня используются в реализации
протокла ISO8583.
Если это секрет можете не отвечать.
...
Рейтинг: 0 / 0
08.02.2007, 15:47
    #34316366
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наоборот BCD и string
sax_А как тогда получше осуществить преобразование unsigned char* в string?

Передавйте указатель на готовый string в функцию в качестве параметра и пишите напрямую.
...
Рейтинг: 0 / 0
08.02.2007, 15:52
    #34316401
sax_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наоборот BCD и string
Не, не секрет. Извращаюсь с USB и микросхемами. Вы по видимому в банковской сфере работаете. А где можно прочитать про эту реализацию. Реализация BCD -> string, или именно этот алгоритм? Хотя других алгоритмов подобного преобразования (хороших алгоритмов) наверно и нет.
...
Рейтинг: 0 / 0
08.02.2007, 16:14
    #34316508
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наоборот BCD и string
sax_Не, не секрет. Извращаюсь с USB и микросхемами. Вы по видимому в банковской сфере работаете. А где можно прочитать про эту реализацию. Реализация BCD -> string, или именно этот алгоритм? Хотя других алгоритмов подобного преобразования (хороших алгоритмов) наверно и нет.

Реализация как привило всегда закрыта, так как может нести
информацию из документации для служебного пользования.
А еще есть и копирайты.

Каждый рисует свою реализацию со своими алгоритмами скорострельностью и багами.
...
Рейтинг: 0 / 0
08.02.2007, 16:25
    #34316560
sax_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наоборот BCD и string
onstat- sax_Не, не секрет. Извращаюсь с USB и микросхемами. Вы по видимому в банковской сфере работаете. А где можно прочитать про эту реализацию. Реализация BCD -> string, или именно этот алгоритм? Хотя других алгоритмов подобного преобразования (хороших алгоритмов) наверно и нет.

Реализация как привило всегда закрыта, так как может нести
информацию из документации для служебного пользования.
А еще есть и копирайты.

Каждый рисует свою реализацию со своими алгоритмами скорострельностью и багами.
Эту реализацию я "надыбал" в этом форуме, но кое-чего сам дописал. Ну это уж не такой сложный алгоритм, что аж для служебного. Ведь это не секрет как BCD загнать в стороку - сдвиг на 4 и побитное "и"
...
Рейтинг: 0 / 0
08.02.2007, 16:38
    #34316620
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наоборот BCD и string
sax_ onstat- sax_Не, не секрет. Извращаюсь с USB и микросхемами. Вы по видимому в банковской сфере работаете. А где можно прочитать про эту реализацию. Реализация BCD -> string, или именно этот алгоритм? Хотя других алгоритмов подобного преобразования (хороших алгоритмов) наверно и нет.

Реализация как привило всегда закрыта, так как может нести
информацию из документации для служебного пользования.
А еще есть и копирайты.

Каждый рисует свою реализацию со своими алгоритмами скорострельностью и багами.
Эту реализацию я "надыбал" в этом форуме, но кое-чего сам дописал. Ну это уж не такой сложный алгоритм, что аж для служебного. Ведь это не секрет как BCD загнать в стороку - сдвиг на 4 и побитное "и"

Сам алгоритм как работать с BCD не есть секретом.
Обратно делатеся также, через здвиг,

Первый байт - сдвигается лево на четыре. младший полубайт обнуляется.
Второй байт - обнуляется старшый полубайт.
Логическим ИЛИ складываются 1 и 2 байты.

Получаем 1 байт пакованный BCD.
...
Рейтинг: 0 / 0
08.02.2007, 16:45
    #34316658
sax_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наоборот BCD и string
С++ вообще плохо знаю, читаю Страуструпа, надеюсь поможет Без практики плохо и стандартные функции не знаю, вот и извращаюсь как могу. К примеру
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int intlenпер(int value){
        int len =  1 ;
        int del =  10 ;
        bool check = false;
        while(!check){
                if ((value/del)>= 1 ){
                        len++;
                        del*= 10 ;
                }
                else
                check = true;
        }
        return len;
}
...
Рейтинг: 0 / 0
08.02.2007, 17:14
    #34316777
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наоборот BCD и string
sax_С++ вообще плохо знаю, читаю Страуструпа, надеюсь поможет Без практики плохо и стандартные функции не знаю, вот и извращаюсь как могу. К примеру
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int intlenпер(int value){
        int len =  1 ;
        int del =  10 ;
        bool check = false;
        while(!check){
                if ((value/del)>= 1 ){
                        len++;
                        del*= 10 ;
                }
                else
                check = true;
        }
        return len;
}



А если число отрицательное?

Так наверное проще и дешевле:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#define MAXSZ  6 

int intlenпер(int value)
{
char buf[MAXSZ+ 1 ];
bzero(&buf[ 0 ], MAXSZ+ 1 );
int res=sprintf(&buf[ 0 ],"%d" ,value);
if ( res!= 1 ) throw some_execption("Not integer value");
return strlen(&buf[ 0 ]);

...
Рейтинг: 0 / 0
08.02.2007, 17:21
    #34316798
sax_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наоборот BCD и string
А так?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int getlength(int value){
        char mas[ 33 ];
        memset(mas, 0 , 33 );
        itoa(value,mas, 10 );
        int len;
        if (value <  0 ) len = strlen(mas)- 1 ;
        else len = strlen(mas);
        return len;
}
...
Рейтинг: 0 / 0
08.02.2007, 17:49
    #34316940
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наоборот BCD и string
sax_А так?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int getlength(int value){
        char mas[ 33 ];
        memset(mas, 0 , 33 );
        itoa(value,mas, 10 );
        int len;
        if (value <  0 ) len = strlen(mas)- 1 ;
        else len = strlen(mas);
        return len;
}


В принципе теже яйца :)

Кстате в моем коде можно выбросить нафик


Код: plaintext
1.
if ( res!= 1 ) throw some_execption("Not integer value");
протормозил.

Он нужен в случае обратного преобразования строки в число через scanf.

Чем scanf лучше atoi? Тем что возвращает количество
корректно считанных(преобразованных) переменных в соотвествии с указанным ему форматом.



Я до сих пор не понял как вы считаете длину отрицательных чисел ?
Почему вы уменьшаете длину если число отрицательное?
...
Рейтинг: 0 / 0
08.02.2007, 17:59
    #34316983
sax_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наоборот BCD и string
onstat- sax_А так?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int getlength(int value){
        char mas[ 33 ];
        memset(mas, 0 , 33 );
        itoa(value,mas, 10 );
        int len;
        if (value <  0 ) len = strlen(mas)- 1 ;
        else len = strlen(mas);
        return len;
}


В принципе теже яйца :)

Кстате в моем коде можно выбросить нафик


Код: plaintext
1.
if ( res!= 1 ) throw some_execption("Not integer value");
протормозил.

Он нужен в случае обратного преобразования строки в число через scanf.

Чем scanf лучше atoi? Тем что возвращает количество
корректно считанных(преобразованных) переменных в соотвествии с указанным ему форматом.



Я до сих пор не понял как вы считаете длину отрицательных чисел ?
Почему вы уменьшаете длину если число отрицательное?

Потому что itoa знак минус тоже учитывает
...
Рейтинг: 0 / 0
08.02.2007, 18:01
    #34316995
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наоборот BCD и string
sax_ onstat- sax_А так?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int getlength(int value){
        char mas[ 33 ];
        memset(mas, 0 , 33 );
        itoa(value,mas, 10 );
        int len;
        if (value <  0 ) len = strlen(mas)- 1 ;
        else len = strlen(mas);
        return len;
}


В принципе теже яйца :)

Кстате в моем коде можно выбросить нафик


Код: plaintext
1.
if ( res!= 1 ) throw some_execption("Not integer value");
протормозил.

Он нужен в случае обратного преобразования строки в число через scanf.

Чем scanf лучше atoi? Тем что возвращает количество
корректно считанных(преобразованных) переменных в соотвествии с указанным ему форматом.



Я до сих пор не понял как вы считаете длину отрицательных чисел ?
Почему вы уменьшаете длину если число отрицательное?

Потому что itoa знак минус тоже учитывает

То есть минус вам в длине не нужен, тогда все понятно.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Наоборот BCD и string / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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