Форум программистов, компьютерный форум CyberForum.ru

char в число - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
Valery_
0 / 0 / 0
Регистрация: 03.11.2009
Сообщений: 101
25.12.2009, 00:13     char в число #1
как можно перевести char A[4]={0x1A, 0x1B, 0x1C, 0x1D} в hex число 0x1A1B1C1D?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Reskov
12 / 12 / 1
Регистрация: 14.12.2009
Сообщений: 33
25.12.2009, 00:45     char в число #2
попробуй так
C++
1
2
3
4
5
6
char A[4]={0x1A, 0x1B, 0x1C, 0x1D} ;
int b=A[0];
for (int i = 1; i < 4; i++) {
    b<<=4*2;
    b+=A[i];
}
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
25.12.2009, 01:17     char в число #3
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
int main(void) /* C89 ANSI */
{
    char a[4] = { 0x1A, 0x1B, 0x1C, 0x1D };
    long n;
    int i;
    
    /* n = a[0] << 8*3 | a[1] << 8*2 | a[2] << 8 | a[3]; */
    
    n = 0;
    for (i = 0; i < sizeof n; i++)
        n += a[i] << 8*(sizeof n - 1 - i);
    
    printf("%#x" "\n", n);
    
    return 0;
}
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
25.12.2009, 20:44     char в число #4
C
1
2
3
4
char A[4]={0x1A, 0x1B, 0x1C, 0x1D};
unsigned long L;
 
L= (A[0]<<24) | (A[1]<<16) | (A[2]<<8) | A[3];
Добавлено через 25 секунд
accept написал какую-то фигню с ошибками
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.12.2009, 01:06     char в число #5
C
1
(A[2]<8)
ага

Добавлено через 3 часа 27 минут
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
 
/* записывает байты из символьного массива в переменную типа long */
int main(void) /* C89 ANSI */
{
    char a[] = { 0x1A, 0x1B, 0x1C, 0x1D }; /* четыре байта */
    long n; /* знаковая переменная
               (знак не имеет значения для шестнадцатеричного вывода) */
    int i; /* счётчик для цикла */
    
    /* примитивная формула, не учитывает длину n,
       поэтому не годится для short n и других;
       но годится в качестве псевдокода для составления цикла */
    
    /* n = a[0] << 8*3 | a[1] << 8*2 | a[2] << 8 | a[3]; */
    
    n = 0; /* прежде обнуляем число,
              хотя, все байты будут перезаписаны */
    for (i = 0; i < sizeof n; i++)
        n += a[i] << 8*(sizeof n - 1 - i);
    /* цикл продолжается для каждого байта переменной n
       на каждом шаге
       выбирается следующее значение из a, начиная с левого;
       к текущему n прибавляется текущее значение из a,
       которое сдвигается влево на три/два/один/ноль байтов
       операция сдвига побитовая, поэтому умножаем на восемь,
       предполагая, что в каждом байте восемь бит */
    
    printf("%#lx" "\n", n);
    /* выводим получившееся значение n на экран
       # - предваряет его 0x
           (шестнадцатеричный признак выводимого числа)
       l - переменная n является long int
       x - вывести переменную в шестнадцатеричном виде */
    
    return 0; /* возвращает в окружающую среду
                 признак успешного завершения программы */
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
26.12.2009, 01:40     char в число #6
Системно-зависимый вариант. На платформах с "big-endian" порядком байт (PowerPC, SPARC, etc...) строку переворачивать не нужно.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <string.h>
 
typedef union {
    char c_[4];
    int i_;
} Un_t;
 
char *memReverse(char *s, size_t len){
    char *h, *t, c;
    for( h = s, t = s + len - 1; h < t; h++, t-- ){
        c = *h;
        *h = *t;
        *t = c;
    }
    return s;
}
 
int main(void){
    Un_t u;
    size_t i;
    char buf[4] = { 0x1a, 0x1b, 0x1c, 0x1d };
    
    for ( i = 0; i < 4; ++i )
        printf("%x", buf[i]);
    memcpy(u.c_, memReverse(buf, 4), 4);
    printf("\n%x\n", u.i_);
    return 0;
}
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
26.12.2009, 14:19     char в число #7
2accept: у тебя код не скомпилируется
например что такое "sizeof n" ?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
26.12.2009, 15:14     char в число #8
Ещё вариант
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <limits.h>
    
int main(void){
    char buf[] = { 0x1a, 0x1b, 0x1c, 0x1d };
    int val = 0;
    size_t i;
    
    for ( i = 0; i < sizeof(int); ++i )
        val += (int)buf[i] << ( CHAR_BIT * ( sizeof(int) - sizeof(char) - i ) );
    
    printf("Array: ");
    for ( i = 0; i < 4; ++i )
        printf("%X", buf[i]);
    printf("\nInteger: %X\n", val);
    return 0;
}
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
27.12.2009, 01:29     char в число #9
Цитата Сообщение от odip
например что такое "sizeof n" ?
видал когда-нибудь

C
1
sizeof array / sizeof array[0]
Код
3.3.3.4 The sizeof operator

Constraints

   The sizeof operator shall not be applied to an expression that has
function type or an incomplete type, to the parenthesized name of such
a type, or to an lvalue that designates a bit-field object.

Semantics

   The sizeof operator yields the size (in bytes) of its operand,
[B]which may be an expression[/B] [COLOR="Red"]or[/COLOR] [B]the parenthesized name of [COLOR="Blue"]a type[/COLOR][/B].  The
size is determined from the type of the operand, which is not itself
evaluated.  The result is an integer constant.
таким образом запись подчёркивает, что n - это не тип
а если записать sizeof(n), то не отличишь, что такое n (кажется, что это может быть типом)

Добавлено через 41 секунду
Цитата Сообщение от odip
у тебя код не скомпилируется
я редко не компилирую перед отправкой, ещё реже не запускаю
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
27.12.2009, 15:31     char в число #10
Ну и что - все равно лучше написать скобки.
У тебя что руки отвалятся ?

Добавлено через 1 минуту
А главное - зачем писать цикл с кучей выражений, если там всего 4 байта ?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
27.12.2009, 16:20     char в число #11
Цитата Сообщение от odip Посмотреть сообщение
А главное - зачем писать цикл с кучей выражений, если там всего 4 байта ?
Наверное, с целью научиться писать циклы с кучей выражений... А так-то можно было просто
C
1
unsigned long L = 0x1a1b1c1d;
написать, и голову себе не морочить
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
28.12.2009, 00:24     char в число #12
Цитата Сообщение от odip
А главное - зачем писать цикл с кучей выражений
а ты про short читал ?
там всего два байта, и цикл будет работать
скобки писать нельзя, потому что в данном случае всё понятно (это очень короткий код, и имя переменной не похоже ни на какой тип)

откуда ты знаешь, что sizeof(n) не будет равно sizeof (n) - лишняя операция, вычисляющая n

когда ты юзаешь (A[0]<<24) - то же самое, зачем тут скобки, если сдвиг находится даже выше, чем операции отношения < > <= >=
а остальные операции & ^ | находятся рядом с присваиванием, у которой приоритет чуть ли не самый нижайший

Добавлено через 3 минуты
Цитата Сообщение от easybudda
C
1
sizeof(int) - sizeof(char)
вот, а здесь, во-первых, при изменении типа с int на short, нужно будет менять цикл
а во-вторых, sizeof(char) всегда равен еденице (поэтому он никогда не используется в выделении памяти)

C
1
2
3
    char *p;
 
    p = (char *) malloc(100);
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
29.12.2009, 15:16     char в число #13
sizeof(char) всегда равен еденице
Ссылку в студию где это написано.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
29.12.2009, 23:30     char в число #14
в картинках
Миниатюры
char в число   char в число  
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
30.12.2009, 13:10     char в число #15
Интересно, а что они будут делать с компами, где размер char равен 4 байта
Gravity
 Аватар для Gravity
556 / 550 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
30.12.2009, 13:29     char в число #16
Цитата Сообщение от odip Посмотреть сообщение
Интересно, а что они будут делать с компами, где размер char равен 4 байта
Пожалуйся в ISO, что они пишут неправильные стандарты.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
30.12.2009, 22:02     char в число #17
Цитата Сообщение от odip
Интересно, а что они будут делать с компами, где размер char равен 4 байта
интересно, что будут делать такие компы, но для таких компов понадобится и новый язык, такой же компактный и мощный
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2010, 09:28     char в число
Еще ссылки по теме:

C++ Преобразовать число int в строку прописью char
C++ Char* в число по ASCII кодам
Вписать в массив char число C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Valery_
0 / 0 / 0
Регистрация: 03.11.2009
Сообщений: 101
22.01.2010, 09:28  [ТС]     char в число #18
перепробовал все варианты. только L=(A[0]<<24)|A[1]<<16)|...
дает правильно посление 2 байта. перед ним FF.
все остальные не правильно. может кто уже разобрался?
Yandex
Объявления
22.01.2010, 09:28     char в число
Ответ Создать тему
Опции темы

Текущее время: 14:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru