1

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

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

2

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

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

Подякували: 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 ,можна навіть відюшки надибати гарні
https://www.youtube.com/watch?v=6rk_evLzF_4

5

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

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

6

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

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

7

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

cheappi386 написав:

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

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

8

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

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

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

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

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

9 Востаннє редагувалося /KIT\ (05.07.2021 11:36:14)

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

del

10

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

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

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

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

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

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

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

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, cheappi386, leofun013

13 Востаннє редагувалося /KIT\ (05.07.2021 11:36:19)

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

del

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 19: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*