2016-11-17 4 views
0

Ich versuche Strlen zu verwenden, um die Länge der Zeichenfolge zu drucken. Ich kenne seine 2 Bytes in der Länge. Strlen gibt jedoch null zurück. Könnte mir bitte jemand erklären warum? Bitte hilf mir.Strlen zeigt 0 für zwei Byte Zeichenfolge

#include <stdio.h> 
#include <stdint.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) { 
    int16_t f = -105; 
    unsigned char *s = malloc(2+1); 
    uint16_t m = htons((uint16_t)f); 
    memcpy(s,(unsigned char*)&m, 2); 
    int16_t v = s[0] << 8 | s[1]; 
    printf("%i \n",m); 
    printf("%i \n",v); 
    printf("%zu \n", strlen(s)); 
    return 0; 
} 
+0

Drucken Sie die Zeichenfolge 's' selbst, um zu sehen, was passiert. –

+0

'm' ist kein Stich, und sein Wert für ein 'char *' wird nicht zu einem String ... – LPs

+0

ich verstehe einen String in C nicht, ist ein Array von Zeichen mit '\ 0' endet. Sie versuchen, die Bytereihenfolge eines int16_t umzukehren und in einer Zeichenkette zu speichern? Keine Ahnung. Was ist dein Zweck ? Wir könnten dir viel mehr helfen. – Stargateur

Antwort

0

Sie kopiert einen Teil einer Nummer in das Array

memcpy(s,(unsigned char*)&m, 2); 

es so eine Art und Weise erfolgen kann, dass als das erste Byte des Arrays führen wird gleich 0 sein und Strlen kehrt auch 0 .

Die Funktion strlen zählt Bytes, bis ein Nullbyte auftritt.

1

Wenn Sie eine uint16_t auf einen Dateideskriptor

int socket; 
... 
uint16_t m = htons(-105); 
write(socket, &m, sizeof(m)); 

Keine Notwendigkeit schreiben wollen hier einen String oder einen Puffer zu verwenden.

Wenn Sie mehr als einen Wert schreiben müssen, können Sie einen Puffer verwenden. Ein kleines Beispiel.

struct buffer { 
    uintmax_t size; 
    uint8_t buffer[1024]; 
} 

bool add_uint16_t(struct buffer *buffer, uint16_t value) 
{ 
    if (buffer->size + 2 >= 1024) 
     return true; 
    buffer->buffer[buffer->size++] = (value >> 0u) & 0xFFu; 
    buffer->buffer[buffer->size++] = (value >> 8u) & 0xFFu; 
    return false; 
} 

bool write_buffer(struct buffer *buffer, int socket) 
{ 
    return write(socket, buffer->buffer, buffer->size) != buffer->size; 
} 

void reset_buffer(struct buffer *buffer) 
{ 
    buffer->size = 0; 
} 
+0

Ich muss mehr Werte zu einem Paket hinzufügen. mehr als 100 16-Bit-Werte. Deshalb habe ich Schnur benutzt. – Abu

+0

Verwenden Sie einen Puffer, wenn Sie wie ein Zeichenpuffer [1024] möchten, vergessen Sie die Zeichenfolge. Aber wenn Sie puffern müssen, ist es sehr schwer zu tun. Sie benötigen es für ein bestimmtes Projekt? Was ist dein Protokoll? Ich kann dir ein kleines Beispiel geben, warte. – Stargateur

+0

UDP, ich benutze sendto in der "const void * message" – Abu