Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
Valery_
0 / 0 / 0
Регистрация: 03.11.2009
Сообщений: 101
#1

char в число - C++

25.12.2009, 00:13. Просмотров 2234. Ответов 17
Метки нет (Все метки)

как можно перевести char A[4]={0x1A, 0x1B, 0x1C, 0x1D} в hex число 0x1A1B1C1D?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2009, 00:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос char в число (C++):

Как в выделенную память записать поочередно число int, массив char[n], и еще число int - C++
Выделяю память void* Start=malloc(Size); Как туда записать поочередно число int, массив char, и еще число int?

Rand число в char - C++
Доброго времени суток. Ребята, очень нужна ваша подсказка... мне надо записать в файл рандомные числа (с диапазоном) через rand(). я...

Вписать в массив char число - C++
Собственно как вписать в массив char число и потом как вывести это число с помощью массива?

Записать число в ячейку char - C++
Здравствуйте. Столкнулся со странной проблемой. Нужно в ячейку str записать некоторое число int. Такой код работает: char...

Char* в число по ASCII кодам - C++
Здравствуйте! Подскажите, пожалуйста, есть ли какой то быстрый способ перевести char* в число по ASCII кодам Например у меня есть: ...

Как перевести шестнадцатеричное число в char? - C++
Как перевести шестнадцатеричное число в char?

17
Reskov
12 / 12 / 1
Регистрация: 14.12.2009
Сообщений: 33
25.12.2009, 00:45 #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];
}
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
25.12.2009, 01:17 #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;
}
0
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
25.12.2009, 20:44 #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 написал какую-то фигню с ошибками
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.12.2009, 01:06 #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; /* возвращает в окружающую среду
                 признак успешного завершения программы */
}
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,851
26.12.2009, 01:40 #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;
}
0
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
26.12.2009, 14:19 #7
2accept: у тебя код не скомпилируется
например что такое "sizeof n" ?
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,851
26.12.2009, 15:14 #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;
}
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
27.12.2009, 01:29 #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
у тебя код не скомпилируется
я редко не компилирую перед отправкой, ещё реже не запускаю
0
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
27.12.2009, 15:31 #10
Ну и что - все равно лучше написать скобки.
У тебя что руки отвалятся ?

Добавлено через 1 минуту
А главное - зачем писать цикл с кучей выражений, если там всего 4 байта ?
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,851
27.12.2009, 16:20 #11
Цитата Сообщение от odip Посмотреть сообщение
А главное - зачем писать цикл с кучей выражений, если там всего 4 байта ?
Наверное, с целью научиться писать циклы с кучей выражений... А так-то можно было просто
C
1
unsigned long L = 0x1a1b1c1d;
написать, и голову себе не морочить
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
28.12.2009, 00:24 #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);
0
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
29.12.2009, 15:16 #13
sizeof(char) всегда равен еденице
Ссылку в студию где это написано.
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
29.12.2009, 23:30 #14
в картинках
0
Миниатюры
char в число   char в число  
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
30.12.2009, 13:10 #15
Интересно, а что они будут делать с компами, где размер char равен 4 байта
0
30.12.2009, 13:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2009, 13:10
Привет! Вот еще темы с ответами:

Максимальное число элементов массива char - C++
Имеем char * DataBuffer = new char; При LMB_write = 2^31 уже вылетает. Как с этим бороться ? :)

Как записать 16ричное число в char - C++
Всем доброго времени суток! Столкнулся с такой проблемой: мне нужно создать строку из 16ричных байтов. Проблема состоит в следующим: как...

Как превратить число из char в int ? - C++
Здрасте всем... Начал я учится и тут же непонятки, помогите плиз. Как мне на самом простом С++ превратить число из чар в инт ? ...

Двух цифровое число в unsigned char - C++
Здравствуйте, есть задача:структура с long-гривны и unsigned char-копейки. Как мне в unsigned char засунуть двух цифровое число? Подобную...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru