powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / byte[] to int
29 сообщений из 29, показаны все 2 страниц
byte[] to int
    #38393907
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!
есть массив байт:
Код: c#
1.
byte [] array = new byte [4] {30, 30, 31, 32} // что означает "0012"



Как из него вытащить число, т.е. должно получиться "12" ?
Код: c#
1.
2.
BitConverter.ToInt32 - не подходит
Convert.ToInt32(Encoding.ASCII.GetString(array)) - тут 2 раза конвертирует, а это долго
...
Рейтинг: 0 / 0
byte[] to int
    #38393922
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Students,
Если только десятичные цифры (без буковок), то
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
int level_ = 1;
int result_ = 0;
int charOffsetConst_ = 30;
for (int i=1;i<=array.Length;i++)
{
    result_+=(array[Length-i]-charOffsetConst_)*level_;
    level_ *=10;
}
...
Рейтинг: 0 / 0
byte[] to int
    #38393927
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, ясно спасибо.

Значит встроенного метода по типу BitConverter.ToInt32 для таких случаев не существует?
...
Рейтинг: 0 / 0
byte[] to int
    #38393930
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Students,

так у тебя ж массив чаров, а не десятичных цифр
...
Рейтинг: 0 / 0
byte[] to int
    #38393931
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мож кто-то и подскажет, чтоб быстро и красиво в одну строчку, я не знаю.
...
Рейтинг: 0 / 0
byte[] to int
    #38393932
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisStudents,
Если только десятичные цифры (без буковок), то
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
int level_ = 1;
int result_ = 0;
int charOffsetConst_ = 30;
for (int i=1;i<=array.Length;i++)
{
    result_+=(array[Length-i]-charOffsetConst_)*level_;
    level_ *=10;
}



Просто в вашем примере слишком много операций нужно выполнить, может даже тогда мне лучше использовать

Код: c#
1.
Convert.ToInt32(Encoding.ASCII.GetString(array))



быстрее будет работать?
...
Рейтинг: 0 / 0
byte[] to int
    #38393940
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Students,

страшно представить, сколько операций выполнится в
Код: c#
1.
Convert.ToInt32(Encoding.ASCII.GetString(array))



Если тебе не миллион таких конвертов в секунду сделать нужно, то применяй.
Я думаю, быстрее, чем мой цикл, вряд ли что-то будет работать.
...
Рейтинг: 0 / 0
byte[] to int
    #38393942
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ясно, спасибо за ответ!
...
Рейтинг: 0 / 0
byte[] to int
    #38393963
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Students,

BitConverter.ToInt32 может подойти, если ты сначала из каждого значения массива вычтешь число 30.
...
Рейтинг: 0 / 0
byte[] to int
    #38394057
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большой граната!

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
byte[] array = new byte[4] {30, 30, 31, 32};
int x;
unsafe
{
    fixed (byte* arrPointer = &array[0])
    {
        var asIntPointer = (int*) arrPointer;
        x = *asIntPointer;
    }
}
...
Рейтинг: 0 / 0
byte[] to int
    #38394073
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorБольшой граната!

[/src]

я вроде уже тут писал сообщение, а оно пропало куды то . повторю


Код: c#
1.
2.
3.
 int a=0;
 byte [] array = new byte [4] {30, 30, 31, 32};
 fixed (byte* b = array) a = *((int*)b);



только у товарища не байты а char . и ему это не поможет
...
Рейтинг: 0 / 0
byte[] to int
    #38394078
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тем более должно быть не
byte [] array = new byte [4] {30, 30, 31, 32}
а
byte [] array = new byte [4] {0x30, 0x30, 0x31, 0x32}
...
Рейтинг: 0 / 0
byte[] to int
    #38394135
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallarisмож кто-то и подскажет, чтоб быстро и красиво в одну строчку, я не знаю.
Код: c#
1.
2.
           Int32 a = (BitConverter.ToInt32(array, 0) - 0x30303030);
           int r = (a >> 24) + ((a >> 16 & 0xff) + ((a >> 8 & 0xff) + (a & 0xff) * 10)*10)*10;



x64 код - получается неплохим, лучше чем для
Код: c#
1.
 int  r = (a >>24) + (a>>16 & 0xff)*10 + (a>>8 & 0xff)*100+ (a & 0xff)*1000;



одинхер основные потери на вызове BitConverter.ToInt32, JIT компилятор порадовал совмещением умножения на 10 и сложения
Код: asm
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
00000093  mov         r8d,dword ptr [rsp+28h] 
00000098  sar         r8d,18h 
0000009c  mov         edx,dword ptr [rsp+28h] 
000000a0  sar         edx,10h 
000000a3  and         edx,0FFh 
000000a9  mov         ecx,dword ptr [rsp+28h] 
000000ad  sar         ecx,8 
000000b0  and         ecx,0FFh 
000000b6  mov         eax,dword ptr [rsp+28h] 
000000ba  and         eax,0FFh 
000000bf  lea         eax,[rax+rax*4] 
000000c2  lea         eax,[rcx+rax*2] 
000000c5  lea         eax,[rax+rax*4] 
000000c8  lea         eax,[rdx+rax*2] 
000000cb  lea         eax,[rax+rax*4] 
000000ce  lea         eax,[r8+rax*2] 
000000d2  mov         dword ptr [rsp+2Ch],eax 
...
Рейтинг: 0 / 0
byte[] to int
    #38395483
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мужики, а вот так разве не легче?
Код: c#
1.
2.
3.
4.
5.
6.
7.
                byte[] arr = new byte[4] { 0x30, 0x30, 0x31, 0x32 };
                int res = 
                    (arr[0] - 0x30) * 1000 +
                    (arr[1] - 0x30) * 100 +
                    (arr[2] - 0x30) * 10 +
                    (arr[3] - 0x30)
                    ;
...
Рейтинг: 0 / 0
byte[] to int
    #38395508
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Kuznetsov,

только если массив всегда длиной 4
...
Рейтинг: 0 / 0
byte[] to int
    #38395514
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Kuznetsov,

Код: c#
1.
int result = (int)new byte[4] { 0x30, 0x30, 0x31, 0x32 }.Reverse().Select((d, i) => (d - 0x30) * Math.Pow(10, i)).Sum();



:)
...
Рейтинг: 0 / 0
byte[] to int
    #38395530
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisAlex Kuznetsov,

только если массив всегда длиной 4Это да, а кто говорит об универсальном решении? У ТС массив чётко - 4 байта...
...
Рейтинг: 0 / 0
byte[] to int
    #38395533
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУAlex Kuznetsov,

Код: c#
1.
int result = (int)new byte[4] { 0x30, 0x30, 0x31, 0x32 }.Reverse().Select((d, i) => (d - 0x30) * Math.Pow(10, i)).Sum();



:)
А Вы, сударь, знаете толк в удовольствиях !
...
Рейтинг: 0 / 0
byte[] to int
    #38395538
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Kuznetsov,

ну, в пользу универсального решения говорит здравый смысл: сегодня длина 4, завтра 6 - иди-ка лезь переписывай код.
...
Рейтинг: 0 / 0
byte[] to int
    #38395544
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisAlex Kuznetsov,

ну, в пользу универсального решения говорит здравый смысл: сегодня длина 4, завтра 6 - иди-ка лезь переписывай код.Вот пусть у ТС голова и болит по этому поводу, а я хочу чтобы у меня завтра болела с похмелья.
С Праздником, Коллеги !!!
...
Рейтинг: 0 / 0
byte[] to int
    #38395545
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex KuznetsovА Вы, сударь, знаете толк в удовольствиях !
Зато одной строчкой и для любой длины массива
...
Рейтинг: 0 / 0
byte[] to int
    #38395549
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, сегодня же праздник! Ура, товарищи!
...
Рейтинг: 0 / 0
byte[] to int
    #38395558
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
УРА!!
...
Рейтинг: 0 / 0
byte[] to int
    #38395670
Фотография Belavik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУAlex Kuznetsov,

Код: c#
1.
int result = (int)new byte[4] { 0x30, 0x30, 0x31, 0x32 }.Reverse().Select((d, i) => (d - 0x30) * Math.Pow(10, i)).Sum();




:)
Почему без использования логарифмов и побитовых операций?
...
Рейтинг: 0 / 0
byte[] to int
    #38395719
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и задроты вы все тут. езжайте картошку копать)
...
Рейтинг: 0 / 0
byte[] to int
    #38395723
FullKettle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanну и задроты вы все тут. езжайте картошку копать)
Уже выкопал
...
Рейтинг: 0 / 0
byte[] to int
    #38395724
FullKettle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FullKettlenetivanну и задроты вы все тут. езжайте картошку копать)
Уже выкАпал
...
Рейтинг: 0 / 0
byte[] to int
    #38396030
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BelavikПочему без использования логарифмов и побитовых операций?
Твоя очередь.
...
Рейтинг: 0 / 0
byte[] to int
    #38396071
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всех с праздником, спасибо за ответы по существу
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / byte[] to int
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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