問題タブ [ansistring]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
963 参照

string - Delphi の ReadStr() と WriteStr()

文字列をバイナリ ファイルに書き込んでいると推測するために、ReadStr と WriteStr を使用するコードがいくつかあります。

ドキュメントの WriteStr の説明では、生データを AnsiString の形でオブジェクトのストリームに書き込むと記載されていますが、これは理にかなっています。しかし、その後 ReadStr は、文字を読み取ると言います。では、それらは互いに反対ではありませんか?

私が持っているとしましょう、

私はそれに WriteStr を使用していますが、実際には何を書きますか? WriteStr は AnsiString を想定しているので、pName をそのようにキャストしますか? その場合、AnsiString ポインタが長さフィールドではなく最初の要素を指しているため、「長さ」フィールドをストリームに書き込みませんか? 私も探していましたが、最近は String == AnsiString のようですが、長さフィールドに関する私の質問はまだ同じです。

長さフィールドをファイルに書き込まないとしても、データの最後に NULL を書き込むのでしょうか? そのため、'\0' を検索して文字列の末尾を見つけることはできますか? ReadStr は NULL 文字まで読み取りますか?

よろしくお願いします:)

0 投票する
1 に答える
1246 参照

memory-management - bds 2006 C 隠しメモリ マネージャの競合 (class new / delete[] vs. AnsiString)

私はBDS 2006 Turbo C++を長い間使用していますが、より大きなプロジェクト ( CAD/CAM、3D gfx エンジン、および天文計算) の一部で例外がスローされることがあります (たとえば、24 時間 365 日のヘビーデューティー使用で 3 ~ 12 か月に 1 回)。 )。広範なデバッグの後、私はこれを見つけました:

このコードは通常、テンプレート内に_sあり、クラスにもなる可能性があるため、delete[]このコードは適切に機能するはずですが、delete[]構造体では適切に機能しません (クラスは問題ないように見えます)。例外はスローされず、メモリは解放されますが、何らかの形でメモリ マネージャーの割り当てテーブルが破損し、その後、新しい割り当てが間違っている可能性があります (新しい割り当ては、既に割り当てられている領域または割り当てられていない領域と重複する割り当てを作成する可能性があるため、時折例外が発生します)

_s空のデストラクタを追加すると、突然すべてが正常に見えることがわかりました

さて、奇妙な部分が来ます。AnsiStringこれをプロジェクトに更新した後、クラスにも不適切な再割り当てがあることがわかりました。例えば:

このコードdatにはいくつかの有用なデータが含まれており、後でtxt行を追加して作成された文字列があるため、txt数回再割り当てする必要があり、datデータが上書きされることがありますtxt(重複していなくても、AnsiString再割り当てに必要な一時txtが重複していると思いますdat)

だから私の質問は:

  1. code1、code2 で何か間違っていますか?
  2. AnsiString(再) 割り当てエラーを回避する方法はありますか? (でもまだ使ってる)

    • AnsiString大規模なデバッグの後 (質問 2 を投稿した後) 、問題を引き起こさないことがわかりました。それらは使用中にのみ発生します。本当の問題は、おそらくOpenGLクライアント間の切り替えにあります。ベクター グラフィックスのプレビューを表示する [開く/保存] ダイアログがあります。これらのVCLサブウィンドウでOpenGLの使用を無効にすると、メモリ管理エラーは完全になくなります。私は何が問題なのかはわかりません ( MFC/VCLウィンドウ間の非互換性、またはコンテキストの切り替えで間違いを犯した可能性が高いため、さらに調査します)。懸念されるOpenGLウィンドウは次のとおりです。AnsiString
    • メインVCLフォーム +クライアント領域内のOpenGLCanvas
    • メインMFCの[開く/保存] ダイアログの子 + ドッキングされたプレビューVCLフォーム +クライアント領域内のOpenGLCanvas

PS

  1. new/delete/delete[]これらのエラーは、割り当てられたサイズではなく、使用回数に依存します
  2. code1 と code2 の両方のエラーが繰り返されます (たとえば、複雑な ini ファイルをロードするパーサーがあり、ini が変更されていない場合、同じ行でエラーが発生します)。
  3. これらのエラーは、 と テンプレートを内部動的割り当てと組み合わせて使用​​する大きなプロジェクト (プレーン ソース コード > 1MB) でのみ検出されますAnsiStringが、より単純なプロジェクトでも発生する可能性がありますが、まれにしか発生しないため、見逃してしまいます。
  4. 感染したプロジェクトの仕様:
    • win32 noinstall スタンドアロン ( Win7sp1 x64を使用しますが、XPsp3 x32では同じように動作します)
    • GDIまたはOpenGl/GLSLを使用する場合は測定しません
    • デバイス ドライバーDLLを使用するかどうかを測定しません。
    • OCXなし、または非標準のVCLコンポーネント
    • DirectXなし
    • 1 バイト アラインされたコンパイル/リンク
    • RTL 、パッケージ、またはフレームワークを使用しない(スタンドアロン)

悪い英語/文法で申し訳ありません...助け/結論/提案をいただければ幸いです。

0 投票する
2 に答える
2177 参照

delphi - [バイトの配列] を Unicode 変換なしで Variant に割り当てます

次のコード スニペットを検討してください(Delphi XE2 の場合)。

Base64ValBase64 としてエンコードされたバイナリ値です (したがって、nullバイトはありません)。( OleVariant) Resultは自動的にマーシャリングされ、クライアント アプリと DataSnap サーバーの間で送信されます。

Wireshark でトラフィックをキャプチャすると、 と の両方が Unicode 文字列として転送されていることがわかりStrValますBase64Val。できれば、 の Unicode 変換を避けたいと思いBase64Valます。私はすべてのタイプを見てきましたが、文字の配列を転送できるVariantもの以外は見当たりません。varString

バイトのバリアント配列を作成する方法を示すこの質問を見つけました。を使用する代わりに、この手法を使用できると考えていAnsiStringます。Unicode 文字列に変換せずに非 Unicode 文字データの配列を Variant に割り当てる別の方法はありますか?

0 投票する
1 に答える
18439 参照

delphi - Delphi XE4 で AnsiString を UnicodeString に変換する方法

上記のように変換しましたが、うまくいきませんでした。str1 で一部のデータが失われていることがわかりました。AnsiString を UnicodeString に安全に変換する方法はありますか?

0 投票する
1 に答える
1116 参照

c++ - XE5 Ansi/Unicode-String リンカ エラー (未解決のエクスターナル)

XE5 で次のリンカー エラーの多くのバージョンを取得します。

これまで読んだすべてから、プロジェクト設定のインクルード構造に何か問題があり、すべての文字列メソッドが実際に定義されている場所にアクセスできないようですが、私の人生では、どこにあるのかわかりませんこれらはあるはずです。

0 投票する
0 に答える
2976 参照

delphi - 1251 コードページのコンピューターで 1252 コードページ AnsiString を使用する

DelphiXE アプリケーションは ANSI アルメニア文字を使用します。拡張 ASCII 文字セットのコードを使用し、特別な CodePage はありません。Computer Active Code Page が 1252 の場合、すべて問題ありません。コンピューターの ACP が 1252 (たとえば 1251) でない場合、ANSI アルメニア文字を含む文字列の値が変更され、アプリケーションが適切に機能しません。

これらの変数を AnsiString として設定しようとしました。検索結果はありません。

の答えで、デビッド・ヘファーナンは使用しました

これにより、文字列変数は、Delphi 2009 で 1251 コードページを使用してエンコードされたものとして Delphi によって解釈されます。

Delphi XE では機能しません。

コンピュータの ACP が 1252 でない場合に、Ansistring 変数が 1252 コードページを使用してエンコードされたものとして Delphi によって解釈されるようにするにはどうすればよいでしょうか?

0 投票する
1 に答える
1062 参照

c++builder - AnsiString を使用してバイナリ データを格納する方法

簡単な質問があります。

AnsiString をバイナリ データのコンテナーとして使用したいと考えています。私はほとんどの場合、TMemoryStream または TFileStream からそのようなデータをロードし、いくつかの処理後に AnsiString から保存します。正常に動作し、問題は見つかりませんでした。

しかし、私が見たところ、そのように使用することで、Sysutils::TBytes代わりに使用する議論が巻き起こっています。なんで?Sysutils::TBytesたとえば、内部に格納されているデータを操作するために使用できる便利なメソッドははるかに少ないですAnsiString。AnsiString と比較すると、明らかに中途半端なコンテナーです。

通常の文字列への変換について気にする必要がある唯一の問題ですか、それとも適切でないものを実際に使用する必要がある他の何かがありますTBytesか? AnsiString を他の文字列型に変換することはしません。これは、別の場所で考えられる問題として引用されていることです。

データをロードする方法の例:

データを保存する方法の例:

では、バイナリデータを正しく保存しても安全でしょうか?

0 投票する
1 に答える
193 参照

string - ansistring の使用中に FPC 終了コード 201 が発生しました。文字列はそれをしません

質問があります。私はこの小さなプログラムを書きましたが、変更してから ansistring に変更するまで、完全に機能ss2stringいました。255 文字をはるかに超えるため、ansistring を使用する必要があります。ご返信ありがとうございます。

0 投票する
2 に答える
302 参照

delphi - Delphi - AnsiString が等しくありませんが、理由がわかりません

Tree 反復の比較演算子があります。AnsiString 変数を使用します。私の問題は、値が等しいように見えるときに、等しいインジケーターを取得していないことです (別名、System.AnsiStrings.CompareStr から 0 を取得していません)。デバッガーを介して変数を確認し、コードをステップ実行しました。両方の変数は AnsiString であり、両方とも同じ値で、スペースはありません。CompareStr は、それが役立つ場合は -65 を返します。

私は何を見落とすことができますか?これが私のコードです。