Wie bestimmt man die Länge eines unsigned char*?

Lesezeit: 5 Minuten

Wie bestimmt man die Länge eines unsigned char*?

  • Die meisten Antworten weisen darauf hin, dass Sie die Bedeutung von “Länge” angeben müssen: Anzahl der Elemente, Größe der Variablen, die den Zeiger enthält, oder beziehen Sie sich möglicherweise auf die (vorzeichenlosen?) Zeichen einer nullterminierten Zeichenfolge?

    – xtofl

    8. Mai 2009 um 12:31 Uhr

Benutzer-Avatar
Spaß

Für die tatsächliche Größe des Zeigers:

size_t s = sizeof(unsigned char*);

Wenn Sie die Länge der Zeichenfolge möchten:

unsigned char* bla = (unsigned char*)"blabla";
int s = strlen((char*)bla);

  • “blabla” ergibt einen schreibgeschützten String, also sollte bla const unsigned char* sein.

    – Bastien Léonard

    7. Mai 2009 um 19:38 Uhr

  • Dies sollte nicht kompilieren. “blabla” ist ein const char*, und Sie können einem unsigned char* kein const char* zuweisen, ohne es zu casten.

    – Brian Neal

    7. Mai 2009 um 20:24 Uhr

  • Das ist keine Zuweisung – es ist Initialisierung – die die ganze Zeit gemacht wird.

    – Steve Fallows

    7. Mai 2009 um 20:26 Uhr

  • Brian hatte recht. Das hat nicht kompiliert. Ich habe es so bearbeitet, dass es jetzt funktioniert.

    – Spaß

    7. Mai 2009 um 20:48 Uhr

  • Es fehlt eine dritte Option: die Länge des zugewiesenen Arrays von Zeichen. Dies unterscheidet sich von der Anzahl der Zeichen vor dem Nullterminator.

    – xtofl

    8. Mai 2009 um 12:25 Uhr

In einer idealen Welt tun Sie das nicht. Sie verwenden char* für Zeichenfolgen im C-Stil (die NUL-terminiert sind und deren Länge Sie messen können) und unsigned char* nur für Bytedaten (die mit ihrer Länge in einem anderen Parameter oder was auch immer enthalten sind und in die Sie wahrscheinlich geraten ein STL-Container so schnell wie möglich, wie z vector<unsigned char> oder basic_string<unsigned char>).

Das Grundproblem besteht darin, dass Sie keine tragbaren Annahmen darüber treffen können, ob die Speicherdarstellungen von char und unsigned char gleich sind. Normalerweise sind sie es, aber sie dürfen es nicht sein. Es gibt also keine stringähnlichen Bibliotheksfunktionen, die auf unsigned char* arbeiten, sondern nur auf char*, und es ist im Allgemeinen nicht sicher, unsigned char* in signed char* umzuwandeln und das Ergebnis als String zu behandeln. Da char signiert sein kann, bedeutet dies kein Casting von unsigned char* in char*.

0 ist jedoch immer die gleiche Wertdarstellung in unsigned char und char. Wenn Sie also in einer nicht idealen Welt irgendwo einen String im C-Stil haben, der aber als unsigned char* angekommen ist, dann (a) wandeln Sie ihn in char* um und machen weiter, aber auch (b ) Finden Sie heraus, wer Ihnen das angetan hat, und bitten Sie ihn, damit aufzuhören.

Dies könnte zwei Bedeutungen haben. Wollen Sie nur wissen, wie groß der Zeigertyp ist? Wenn ja, dann ist Joces Antwort richtig

size_t size = sizeof(unsigned char*);

Wenn Sie wissen möchten, auf wie viele Elemente der Zeiger zeigt, ist das etwas komplexer. Wenn dies eine Zeichenfolge im C-Stil ist, ist strlen oder eine andere Variante die beste Option.

Wenn dies jedoch nur ein Zeiger auf unsigned char ist, der keine Beziehung zu einer Zeichenfolge im C-Stil hat, gibt es keine Möglichkeit, zuverlässig das zu erreichen, wonach Sie suchen. C/C++ verknüpft kein Längenfeld mit einem Zeiger. Sie müssen die Länge mit dem Zeiger herumreichen oder eine Klasse wie Vektor verwenden, die sowohl den Zeiger als auch die Länge speichert.

  • Sie haben Recht damit, dass Sie die zugewiesene Länge nicht abrufen können – in den Augen vieler Menschen eine schlechte Entscheidung für das Sprachdesign. Sie irren sich darin, dass es zwei Bedeutungen gibt: Es könnte sein, dass Sie die Länge der enthaltenen nullterminierten Zeichenfolge kennen müssen, obwohl es besser wäre, ein Zeichen mit Vorzeichen zu verwenden. Mach es zweieinhalb 🙂

    – xtofl

    8. Mai 2009 um 12:29 Uhr

Wenn Sie C++ verwenden und es sich um einen String in einem unsigned char* handelt, sollten Sie ihn besser zuerst in einen std::string einfügen, bevor Sie ihn bearbeiten. Auf diese Weise können Sie alle möglichen Dinge damit tun und trotzdem die Länge () und / oder Kapazität () davon abrufen, wann immer Sie möchten.

Ich gehe davon aus, dass Sie Dinge mit dem Array tun, um seine Größe nicht konstant zu machen. Wenn Sie nur zuweisen, festlegen und vergessen, können Sie die tatsächliche Zuweisungsgröße des Arrays jederzeit in einer separaten Variablen speichern – oder besser eine Struktur/Klasse erstellen.

//WARNING: memory issues not addressed here.
struct myStringStruct
{
  unsigned char * string;
  int len;

  allocate(int size) {
    len = size;
    string = malloc(sizeof(unsigned char) * len);
  }
}

Noch komplexer als das und Sie erfinden std::string neu.

Möchten Sie die Länge des Zeigers, der ein int wäre. Wenn Sie die Länge des Strings wollen, auf den gezeigt wird, verwenden Sie strlen: zB Größe des Zeigers: sizeof(unsigned char*) Größe des Strings: strlen(unsigned char*) Multibyte-Zeichen werden als ..multi byte gemeldet

  • Recht. Ich hätte size_t sagen sollen

    – Rohit

    7. Mai 2009 um 20:26 Uhr

Benutzer-Avatar
Chandana Kumara

Wenn Sie in C-Code kompilieren, wird die strlen() Funktionsparameter behandeln können “unsigned char*”;
aber in C++-Code können die Parameter nicht umgehen "unsigned char*";
Wenn Sie also in C++-Code kompilieren, müssen Sie die Übersetzung erzwingen (unsigned char*)str.

  • Recht. Ich hätte size_t sagen sollen

    – Rohit

    7. Mai 2009 um 20:26 Uhr

unsigned char s[] = “Beispielzeichenfolge”;

int len ​​= sizeof(s);

  • Können Sie erklären, was Ihr Code ein bisschen mehr tut?

    – Semih Arslanoglu

    11. Juni um 11:25 Uhr

1385520cookie-checkWie bestimmt man die Länge eines unsigned char*?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy