Тема: Як парсити бінарні дані в джаві ?
Коли нема беззнакових типів, то як витравлювати біт знаковості ?
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Java → Як парсити бінарні дані в джаві ?
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Коли нема беззнакових типів, то як витравлювати біт знаковості ?
а шо за біт знаковості? то він самий перший зліва стоїть? може тупо через побітове AND?
Це й проблема, я не як не можу зрозуміти як ця знаковість працює.Зробив невеличке дослідження на цю тему, й ще більше заплутався.
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();
}
}
то ви спершу розберіться зі знаковістю, повирішуйте декілька задач на листочку, а потім вже кодуйте то
я сам того не знаю, наприклад, але то легко мона зрозуміти, прочитавши декілька статей по темі negative binary numbers ,можна навіть відюшки надибати гарні
https://www.youtube.com/watch?v=6rk_evLzF_4
Нащо мені відео про позиційні системи счислення, якщо я просто неможу зрозуміти де в цій клятій жабі втикаєтся біт для керування знаком?
Беззнакових типів нема, але беззнакові операції можливі за допомогою зручної обгортки
Коли нема беззнакових типів, то як витравлювати біт знаковості ?
Можете пояснити, нащо вам його "витравлювати"? Якщо ви кодуєте число 1, то воно і знакове, і беззнакове буде 1. А якщо кодуєте -1, то що вам дасть "витравлювання" знакового біту? Яке число ви хочете отримати, "витравивши" його?
cheappi386 написав:Коли нема беззнакових типів, то як витравлювати біт знаковості ?
Можете пояснити, нащо вам його "витравлювати"? Якщо ви кодуєте число 1, то воно і знакове, і беззнакове буде 1. А якщо кодуєте -1, то що вам дасть "витравлювання" знакового біту? Яке число ви хочете отримати, "витравивши" його?
Тоді поясніть мені, чому коли я намагаюсь через бінарний літерал задати у джаві значення для byte, мені дають використати тільки СІМ разрядів ? Що тоді буде у восьмому ???
del
koala написав:cheappi386 написав:Коли нема беззнакових типів, то як витравлювати біт знаковості ?
Можете пояснити, нащо вам його "витравлювати"? Якщо ви кодуєте число 1, то воно і знакове, і беззнакове буде 1. А якщо кодуєте -1, то що вам дасть "витравлювання" знакового біту? Яке число ви хочете отримати, "витравивши" його?
Тоді поясніть мені, чому коли я намагаюсь через бінарний літерал задати у джаві значення для byte, мені дають використати тільки СІМ разрядів ? Що тоді буде у восьмому ???
З цього моменту можна детальніше? Як саме вам "не дають" його задати? До вас приїжджає чорний бусик із міцними хлопцями кожного разу, як ви намагаєтеся задати 8-бітне значення, і тримають вас за руки?
cheappi386 написав:koala написав:Можете пояснити, нащо вам його "витравлювати"? Якщо ви кодуєте число 1, то воно і знакове, і беззнакове буде 1. А якщо кодуєте -1, то що вам дасть "витравлювання" знакового біту? Яке число ви хочете отримати, "витравивши" його?
Тоді поясніть мені, чому коли я намагаюсь через бінарний літерал задати у джаві значення для byte, мені дають використати тільки СІМ разрядів ? Що тоді буде у восьмому ???
З цього моменту можна детальніше? Як саме вам "не дають" його задати? До вас приїжджає чорний бусик із міцними хлопцями кожного разу, як ви намагаєтеся задати 8-бітне значення, і тримають вас за руки?
Вельмешановний пане троль,якщо у вас виходить так зробить,то так і пишіть.А мені екліпс пропонує, бінарний літерал с 8 розрядів "скастити" до байту,а з 7 розрядами усе ОК.
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
del
cheappi386
Звернув увагу що Ви працюєте над мережевим застосунком і мабуть Вас цікавить проблема знаковості у контексті передачі беззнакових байтів і отримання їх у джаві, яка не має такого типу.
А що з "host order" та "network order" ? Просто два байти переставити місцями ?
А що з "host order" та "network order" ? Просто два байти переставити місцями ?
Чотири насправді. Читайте це як little endian та big endian, в деяких архітектурах, наприклад х86. Здається (брехати не буду, точно не знаю), в джави це все network order.
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);
Тобто якщо ви надішлете unsigned byte 130 з сі і зі сторони джави зробите Byte#toUnsignedInt, Ви отримаєте ті ж 130, тільки як int.
а у випадку андройда що робити?
iovchynnikov написав:Тобто якщо ви надішлете unsigned byte 130 з сі і зі сторони джави зробите Byte#toUnsignedInt, Ви отримаєте ті ж 130, тільки як int.
а у випадку андройда що робити?
Тобто що робити? Як на дроїді отримати unsigned byte (як int)?
cheappi386 написав:iovchynnikov написав:Тобто якщо ви надішлете unsigned byte 130 з сі і зі сторони джави зробите Byte#toUnsignedInt, Ви отримаєте ті ж 130, тільки як int.
а у випадку андройда що робити?
Як на дроїді отримати unsigned byte (як int)?
так
iovchynnikov написав:cheappi386 написав:а у випадку андройда що робити?
Як на дроїді отримати unsigned byte (як int)?
так
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися