QByteArray, Char-to-Float-Methode und Computer-Endian-Beurteilung

Projektszenario

Über udp wird ein Datensatz empfangen. Die Daten bestehen aus 32 Bytes. Alle vier Bytes sind ein Float, insgesamt 8 Floats. Die gesendeten Daten werden im Little-Endian-Modus gesendet.
Little Endian: High-Byte zuletzt, Low-Byte zuerst.
Big Endian: High-Byte zuerst, Low-Byte zuletzt.


Problembeschreibung

Das Problem der nativen Big- und Small-Endianness wurde nicht berücksichtigt, was dazu führte, dass die von der Memcpy-Funktion konvertierten Float-Daten falsch waren.


Ursachenanalyse:

Bei dieser Maschine handelt es sich um eine Little-Endian-Maschine. Bei Verwendung von memcpy wird die Konvertierung standardmäßig im Little-Endian-Format durchgeführt. Wenn die Daten im Big-Endian-Format übertragen werden, müssen zuerst die Konvertierungsdaten und dann die Daten umgekehrt werden umgewandelt. Wenn der lokale Computer und der Modus der zu konvertierenden Daten identisch sind, ist keine Umkehrung erforderlich. Verwenden Sie einfach memcpy, um direkt zu konvertieren.


Lösung:

Bestimmen Sie zuerst die Big- und Small-Endian-Größe des Computers und konvertieren Sie dann den Datentyp (dieser Computer weiß bereits, dass es Little-Endian ist, was dem Modus entspricht, in dem die Daten gesendet werden). Es ist auch Little-Endian, also einfach memcpy direkt verwenden)

QByteArray datagram1;
datagram1.resize(32);
datagram.resize(udpSocket_data_recv->pendingDatagramSize()); // 接收数据报,将其存放到datagram中         
udpSocket_data_recv->readDatagram(datagram.data(), datagram.size());
if(datagram.size() == 32)
{
    
    
	float acc[8];
	memcpy(acc, datagram.mid(0, 32), 32);
}

Big-Endian-Beurteilungsmethode:

#include<stdio.h>
int main()
{
    
    
    int val=0x11223344;
    char *p=(char *)&val;
    if(*p==0x44)//若低地址为低位0x44,则为小端模式,因为先存低位
        printf("Little Endian\n");
    if(*p==0x11)//若低地址为高位0x11,则为大端模式
        printf("Big Endian\n");
    return 0;
}

Guess you like

Origin blog.csdn.net/qq_30727593/article/details/132325513