1

Тема: Як парсити бінарні дані в джаві ?

Коли нема беззнакових типів, то як витравлювати біт знаковості ?

2

Re: Як парсити бінарні дані в джаві ?

а шо за біт знаковості? то він самий перший зліва стоїть? може тупо через побітове AND?

All you want is a dingle,
What you envy's a schwang,
A thing through which you can tinkle,
Or play with, or simply let hang...
Подякували: koala1

3

Re: Як парсити бінарні дані в джаві ?

Це й проблема, я не як не можу зрозуміти як ця знаковість працює.Зробив невеличке дослідження на цю тему, й ще більше заплутався.

typedef union
{
    struct
    {
        unsigned char bit1 : 1;
        unsigned char bit2 : 1;
        unsigned char bit3 : 1;
        unsigned char bit4 : 1;
        unsigned char bit5 : 1;
        unsigned char bit6 : 1;
        unsigned char bit7 : 1;
        unsigned char bit8 : 1;
    }u;
    unsigned char byte;
}byte_rep;

void PrintBinByte(unsigned char byte)
{
    byte_rep br;
    br.byte = byte;
    printf("%d: [1]%d [2]%d [3]%d [4]%d [5]%d [6]%d [7]%d [8]%d\n", byte,
        br.u.bit1,br.u.bit2, br.u.bit3,br.u.bit4, br.u.bit5, br.u.bit6, br.u.bit7, br.u.bit8);
}

int main()
{
    WSADATA wsd = { 0 };
    WSAStartup(MAKEWORD(2, 2), &wsd);
    struct sockaddr_in server;
    SOCKET s;
    if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d", WSAGetLastError());
    }
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons(3000);
    if (bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
    {
        printf("Bind failed with error code : %d", WSAGetLastError());
    }
    unsigned char *buf = new unsigned char[1024 * 4];
    int alen = sizeof(server),rec_len=0;
    for (;;)
    {
        rec_len = recvfrom(s, (char*)buf, 1024*4, 0, (struct sockaddr *) &server, &alen);
        printf("received bytes: %d\n", rec_len);
        PrintBinByte(buf[0]);
    }
    _getch();
    return 0;
}
public class Main
{
    private static void test1()
    {
        try
        {
            DatagramSocket clientSocket = new DatagramSocket();
            InetAddress IPAddress = InetAddress.getByName("localhost");
            byte[] sendData = new byte[16];
            DatagramPacket sendPacket = new DatagramPacket(sendData, /*sendData.length*/1, IPAddress, 3000);
            byte testData=(byte)255;
            sendData[0]=testData;
            clientSocket.send(sendPacket);
            clientSocket.close();
            System.out.println(Integer.toBinaryString(testData));
        } 
        catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
    public static void main(String[] args) 
    {
        // TODO Auto-generated method stub
        test1();
    }

}

4

Re: Як парсити бінарні дані в джаві ?

то ви спершу розберіться зі знаковістю, повирішуйте декілька задач на листочку, а потім вже кодуйте то
я сам того не знаю, наприклад, але то легко мона зрозуміти, прочитавши декілька статей по темі negative binary numbers ,можна навіть відюшки надибати гарні

All you want is a dingle,
What you envy's a schwang,
A thing through which you can tinkle,
Or play with, or simply let hang...

5

Re: Як парсити бінарні дані в джаві ?

Нащо мені відео про позиційні системи счислення, якщо я просто неможу зрозуміти де в цій клятій жабі втикаєтся біт для керування знаком?

6

Re: Як парсити бінарні дані в джаві ?

Беззнакових типів нема, але беззнакові операції можливі за допомогою зручної обгортки

Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»

7

Re: Як парсити бінарні дані в джаві ?

cheappi386 написав:

Коли нема беззнакових типів, то як витравлювати біт знаковості ?

Можете пояснити, нащо вам його "витравлювати"? Якщо ви кодуєте число 1, то воно і знакове, і беззнакове буде 1. А якщо кодуєте -1, то що вам дасть "витравлювання" знакового біту? Яке число ви хочете отримати, "витравивши" його?

8

Re: Як парсити бінарні дані в джаві ?

koala написав:
cheappi386 написав:

Коли нема беззнакових типів, то як витравлювати біт знаковості ?

Можете пояснити, нащо вам його "витравлювати"? Якщо ви кодуєте число 1, то воно і знакове, і беззнакове буде 1. А якщо кодуєте -1, то що вам дасть "витравлювання" знакового біту? Яке число ви хочете отримати, "витравивши" його?

Тоді поясніть мені, чому коли я намагаюсь через бінарний літерал задати у джаві значення для byte, мені дають використати тільки СІМ разрядів ? Що тоді буде у восьмому ???

9

Re: Як парсити бінарні дані в джаві ?

cheappi386 написав:
koala написав:
cheappi386 написав:

Коли нема беззнакових типів, то як витравлювати біт знаковості ?

Можете пояснити, нащо вам його "витравлювати"? Якщо ви кодуєте число 1, то воно і знакове, і беззнакове буде 1. А якщо кодуєте -1, то що вам дасть "витравлювання" знакового біту? Яке число ви хочете отримати, "витравивши" його?

Тоді поясніть мені, чому коли я намагаюсь через бінарний літерал задати у джаві значення для byte, мені дають використати тільки СІМ разрядів ? Що тоді буде у восьмому ???

01010101
Останній біт, той що червоний - знаковий біт. 0 - число додатне, 1 - число від'ємне. Інші - дата біти.
Якщо хочете використовувати всі ВІСІМ бітів, то використовуйте:

// Parse an unsigned byte
byte b = (byte) Integer.parseInt("Ваше беззнакове число тут");
Yml0Y29pbjoxNmVTc0NyOXJySHBTV
DlGVmZjamV5djh5ZEtHM1NuNFNaCm
RvZ2Vjb2luOkROdXhrWExCaEh6eE1
wajFwbWhSdGlKWXZvWXJRckNiQjc=
Подякували: LoganRoss1

10

Re: Як парсити бінарні дані в джаві ?

cheappi386 написав:
koala написав:
cheappi386 написав:

Коли нема беззнакових типів, то як витравлювати біт знаковості ?

Можете пояснити, нащо вам його "витравлювати"? Якщо ви кодуєте число 1, то воно і знакове, і беззнакове буде 1. А якщо кодуєте -1, то що вам дасть "витравлювання" знакового біту? Яке число ви хочете отримати, "витравивши" його?

Тоді поясніть мені, чому коли я намагаюсь через бінарний літерал задати у джаві значення для byte, мені дають використати тільки СІМ разрядів ? Що тоді буде у восьмому ???

З цього моменту можна детальніше? Як саме вам "не дають" його задати? До вас приїжджає чорний бусик із міцними хлопцями кожного разу, як ви намагаєтеся задати 8-бітне значення, і тримають вас за руки?

Подякували: 0xDADA11C7, /KIT\, LoganRoss3

11

Re: Як парсити бінарні дані в джаві ?

koala написав:
cheappi386 написав:
koala написав:

Можете пояснити, нащо вам його "витравлювати"? Якщо ви кодуєте число 1, то воно і знакове, і беззнакове буде 1. А якщо кодуєте -1, то що вам дасть "витравлювання" знакового біту? Яке число ви хочете отримати, "витравивши" його?

Тоді поясніть мені, чому коли я намагаюсь через бінарний літерал задати у джаві значення для byte, мені дають використати тільки СІМ разрядів ? Що тоді буде у восьмому ???

З цього моменту можна детальніше? Як саме вам "не дають" його задати? До вас приїжджає чорний бусик із міцними хлопцями кожного разу, як ви намагаєтеся задати 8-бітне значення, і тримають вас за руки?

Вельмешановний пане троль,якщо у вас виходить так зробить,то так і пишіть.А мені екліпс пропонує, бінарний літерал с 8 розрядів "скастити" до байту,а з 7 розрядами усе ОК.

12

Re: Як парсити бінарні дані в джаві ?

cheappi386
Звернув увагу що Ви працюєте над мережевим застосунком і мабуть Вас цікавить проблема знаковості у контексті передачі беззнакових байтів і отримання їх у джаві, яка не має такого типу.

Хочу Вас запевнити, для Вас це не має ніякої різниці. Бінарний вигляд -126 в джаві такий самий як і 130 в unsigned byte = 1000 0010. Тобто якщо ви надішлете unsigned byte 130 з сі і зі сторони джави зробите Byte#toUnsignedInt, Ви отримаєте ті ж 130, тільки як int. Єдине де це може мати значення, якщо Ви використовуєте потім це значення для знакових операцій, або ж робите доступ до масиву.

Немає ніякого магічного флага який вказує що це "signed" чи "unsigned", не знаю звідки /KIT\ взяв таку інформацію.

Детальніше: https://en.wikipedia.org/wiki/Two%27s_complement

Подякували: koala, cheappi3862

13

Re: Як парсити бінарні дані в джаві ?

iovchynnikov
Схоже я неправильно зрозумів питання: https://stackoverflow.com/questions/426 … te-in-java

Yml0Y29pbjoxNmVTc0NyOXJySHBTV
DlGVmZjamV5djh5ZEtHM1NuNFNaCm
RvZ2Vjb2luOkROdXhrWExCaEh6eE1
wajFwbWhSdGlKWXZvWXJRckNiQjc=

14

Re: Як парсити бінарні дані в джаві ?

iovchynnikov написав:

cheappi386
Звернув увагу що Ви працюєте над мережевим застосунком і мабуть Вас цікавить проблема знаковості у контексті передачі беззнакових байтів і отримання їх у джаві, яка не має такого типу.

А що з "host order" та "network order" ? Просто два байти переставити місцями ?

15

Re: Як парсити бінарні дані в джаві ?

А що з "host order" та "network order" ? Просто два байти переставити місцями ?

Чотири насправді. Читайте це як little endian та big endian, в деяких архітектурах, наприклад х86. Здається (брехати не буду, точно не знаю), в джави це все network order.

Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»

16

Re: Як парсити бінарні дані в джаві ?

cheappi386 написав:
iovchynnikov написав:

cheappi386
Звернув увагу що Ви працюєте над мережевим застосунком і мабуть Вас цікавить проблема знаковості у контексті передачі беззнакових байтів і отримання їх у джаві, яка не має такого типу.

А що з "host order" та "network order" ? Просто два байти переставити місцями ?

Використайте https://docs.oracle.com/javase/7/docs/a … ffer.html. Можна парсити Big/Little- endian.

ByteBuffer bb = ByteBuffer.wrap(littleEndianArray);
bb.order(ByteOrder.LITTLE_ENDIAN); // bb.order(ByteOrder.BIG_ENDIAN); (типово)
process(bb);
ByteBuffer bb = ByteBuffer.wrap(bigEndianArray);
// bb.order(ByteOrder.BIG_ENDIAN); (типово)
process(bb);

17

Re: Як парсити бінарні дані в джаві ?

iovchynnikov написав:

Тобто якщо ви надішлете unsigned byte 130 з сі і зі сторони джави зробите Byte#toUnsignedInt, Ви отримаєте ті ж 130, тільки як int.

а у випадку андройда що робити?

18

Re: Як парсити бінарні дані в джаві ?

cheappi386 написав:
iovchynnikov написав:

Тобто якщо ви надішлете unsigned byte 130 з сі і зі сторони джави зробите Byte#toUnsignedInt, Ви отримаєте ті ж 130, тільки як int.

а у випадку андройда що робити?

Тобто що робити? Як на дроїді отримати unsigned byte (як int)?

19 Востаннє редагувалося cheappi386 (19.06.2017 20:35:38)

Re: Як парсити бінарні дані в джаві ?

iovchynnikov написав:
cheappi386 написав:
iovchynnikov написав:

Тобто якщо ви надішлете unsigned byte 130 з сі і зі сторони джави зробите Byte#toUnsignedInt, Ви отримаєте ті ж 130, тільки як int.

а у випадку андройда що робити?

Як на дроїді отримати unsigned byte (як int)?

так

20

Re: Як парсити бінарні дані в джаві ?

cheappi386 написав:
iovchynnikov написав:
cheappi386 написав:

а у випадку андройда що робити?

Як на дроїді отримати unsigned byte (як int)?

так

http://uk.lmgtfy.com/?q=java+unsigned+byte  *OK*