プロが教える店舗&オフィスのセキュリティ対策術

C++ Builderでプログラミングをやっているのですが、

String memo1 = "あいうえお";


という文字列を

unsigned char test_bin[1000];

バイトで宣言した配列に



test_bin[0] = memo1の1バイト目;
test_bin[0] = memo1の2バイト目;
test_bin[0] = memo1の3バイト目;
test_bin[0] = memo1の4バイト目;
test_bin[0] = memo1の5バイト目;


このように、文字列データのバイト数値を数値変数に代入させることはできますでしょうか?


どうぞ、ご教授の程よろしくお願い致します。

A 回答 (5件)

No1です


>このようにコピーした時には文字コードは考慮されないのでしょうか?
何か勘違いされてるような気がしますが文字コードはコピー元の文字で考慮すべき問題です
少なくても strcpy 関数にて文字コードが変化することはありません

元々格納されていた文字列がユニコードなのであればユニコードの文字コードがコピーされ
SJISであればSJISの文字コードがそのままコピーされます
    • good
    • 0
この回答へのお礼

回答頂きありがとうとざいます。strcpy 関数というのがそのままのバイト数値をコピーできる機能と言うことがわかりました。助かります。

お礼日時:2013/08/07 21:01

C++Builderのバージョンが記載されていませんので、C++Builder 2009以降のバージョン(2009/2010/XE/XE2/XE3/XE4)を前提に話をします。



C++Builder 2009以降では、String型はUnicodeString型になっています。
typedef UnicodeString String;

UnicodeStringからバイト配列を取得するには、TEncodingのGetBytesメソッドを使用します。

//UTF-16
TByteDynArray bytes = TEncoding::Unicode->GetBytes(memo0);

//UTF-8
TByteDynArray bytes = TEncoding::UTF8->GetBytes(memo0);

//OSの標準の文字コード(日本語WindowsならShift_JIS)
TByteDynArray bytes = TEncoding::Default->GetBytes(memo0);

//特定の文字コードを指定する例(ここではコードページ20932(EUC-JP)を指定している)
TEncoding* enc = TEncoding::GetEncoding(20932);
TByteDynArray bytes = enc->GetBytes(memo0);
delete enc;

・System.SysUtils.TEncoding - RAD Studio API Documentation
 http://docwiki.embarcadero.com/Libraries/XE4/ja/ …

TByteDynArrayはDynamicArray<Byte>です。
Lengthプロパティで要素数を取得、operator[]で指定したインデックスの要素を取得できます。
詳しいDynamicArrayの使い方はマニュアルをご覧ください。

・System.TByteDynArray - RAD Studio API Documentation
 http://docwiki.embarcadero.com/Libraries/XE4/ja/ …

・System.DynamicArray - RAD Studio API Documentation
 http://docwiki.embarcadero.com/Libraries/XE4/ja/ …

もう一つの方法として、AnsiStringに変換してc_str()メソッドを使用する方法もあります。

//OSの標準の文字コード(日本語WindowsならShift_JIS)
AnsiString sjis = memo0;
char* c = sjis.c_str();

//特定の文字コードを指定する例(ここではコードページ20932(EUC-JP)を指定している)
AnsiStringT<20932> eucjp = memo0;
char* c = eucjp.c_str();

//UTF8(UTF8StringはAnsiStringT<65001>)
UTF8String utf8 = memo0;
char* c = utf8.c_str();

・System.AnsiStringT - RAD Studio API Documentation
 http://docwiki.embarcadero.com/Libraries/XE4/ja/ …

・System.AnsiStringT.c_str - RAD Studio API Documentation
 http://docwiki.embarcadero.com/Libraries/XE4/ja/ …
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。C++ Builder 2009を使っているので、とても参考になります。助かります。

お礼日時:2013/08/07 21:01

>このようにコピーした時には文字コードは考慮されないのでしょうか?



されません。
strcpy()はバイト単位でみて'\0'までをコピーするだけです。
バイト単位でなのでUTF-16やUTF-32の文字列コピーには使用できません。

javaのときもそうでしたけど使用する関数のマニュアルなど読まれてますか?
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。詳しい解説頂き助かります。

お礼日時:2013/08/07 20:59

回答できるわけではありませんが文字コードは考慮しなくていいんでしょうか?

この回答への補足

いつもお世話になっております。文字コードに関してなんですが、

strcpy((char*)tmp_bin, memo0.c_str());

このようにコピーした時には文字コードは考慮されないのでしょうか?


tmp_binのバイト配列にデータコピーした際にユニコードを考慮したデータコピーのやり方もありますでしょうか?

補足日時:2013/08/02 20:47
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。
確かにバイナリで文字コードはどうするのかというのはよく聞きますね。

ちょっと前にjavaで同じようなことをやろうとしてたら

String str = "あいうえお";
byte[] utf8 = str.getBytes("UTF-8");
byte[] utf16 = str.getBytes("UTF-16");
byte[] utf32 = str.getBytes(Charset.forName("UTF-32"));
byte[] win31 = str.getBytes(Charset.forName("Windows-31j"));


このような感じでバイトにできるようなので、c++ Builderにも同じようなことはできないかなという感じです。


今回はとりあえず

あいうえお

というのがどういうバイトで構成されてるのかをそのまま別のバイトにコピーできればいいかなという感じです。

お礼日時:2013/08/02 16:05

使って無いんで間違ってたらすいません


普通にコピーすればいいだけだと思いますが
(unsigned char* とchar* の違いはキャストすればいいだけのような)
strcpy((char*)test_bin, memo1.c_str());  でできません?

http://yunix.info/BCBHelp/SubstituteCouple_Strin …
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。


strcpy((char*)tmp_bin, memo0.c_str());

for(int j=0;j<20;j++)
{
test_bin[0+(200*i)+j] = tmp_bin[j];
}



このようなことができますね! 助かります。

お礼日時:2013/08/02 16:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!