C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: StringをByte[]に


(過去ログ 90 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■53992 / inTopicNo.1)  StringをByte[]に
  
□投稿者/ ばいなり (1回)-(2010/10/01(Fri) 18:38:56)

分類:[.NET 全般] 

VS2005 C# .Net CompactFramework
を使用しています。

textBox1にA1と入力し、
それをByte[]にしたいです。

data = Encoding.Unicode.GetBytes(textBox1.Text);

data = Encoding.ASCII.GetBytes(textBox2.Text);

を試したのですが、
61 31という答えになってしまいます。
求めている答えはa1です。
どうすればいいですか?
引用返信 編集キー/
■53993 / inTopicNo.2)  Re[1]: StringをByte[]に
□投稿者/ Hongliang (724回)-(2010/10/01(Fri) 18:46:51)
入力を 16 進文字列として変換したいと。
二文字から byte に変換するには Convert.ToByte で、第二引数に 16 を指定すれば可能です。
入力文字列がそれより長いなら、ループで回して Substring などで二文字ずつ取り出して変換していけばいいでしょう。

// 文字数が奇数の場合の考慮をしておくべきですが。
引用返信 編集キー/
■53994 / inTopicNo.3)  Re[2]: StringをByte[]に
□投稿者/ ばいなり (2回)-(2010/10/01(Fri) 19:08:10)
No53993 (Hongliang さん) に返信
> 入力を 16 進文字列として変換したいと。
> 二文字から byte に変換するには Convert.ToByte で、第二引数に 16 を指定すれば可能です。
> 入力文字列がそれより長いなら、ループで回して Substring などで二文字ずつ取り出して変換していけばいいでしょう。
>
> // 文字数が奇数の場合の考慮をしておくべきですが。

int j = 0;
for (int position = 0; ; j++)
{
data = textBox2.Text.Substring(position, 2);
byteArrayData[j] = Convert.ToByte(data, 16);※
position += 2;
}
このようにコーディングをしたら
※にNullReferenceExceptionと例外が出てしまいました。
コーディングが間違っているのでしょうか?
引用返信 編集キー/
■53995 / inTopicNo.4)  Re[3]: StringをByte[]に
□投稿者/ Hongliang (725回)-(2010/10/01(Fri) 19:21:08)
byteArrayData を new してないんでしょう。
new するときに必要な要素数は文字列の長さから求められますよね?
引用返信 編集キー/
■53996 / inTopicNo.5)  Re[4]: StringをByte[]に
□投稿者/ ばいなり (3回)-(2010/10/01(Fri) 19:24:09)
No53995 (Hongliang さん) に返信
> byteArrayData を new してないんでしょう。
> new するときに必要な要素数は文字列の長さから求められますよね?

new byte[] byteArrayData;
これでいいのでしょうか?
文字列の長さは決まっていないのですが
要素数は指定しないとエラーになりますか?
引用返信 編集キー/
■53997 / inTopicNo.6)  Re[5]: StringをByte[]に
□投稿者/ ばいなり (4回)-(2010/10/01(Fri) 19:31:22)
2010/10/01(Fri) 19:32:32 編集(投稿者)

No53996 (ばいなり さん) に返信
> ■No53995 (Hongliang さん) に返信
>>byteArrayData を new してないんでしょう。
>>new するときに必要な要素数は文字列の長さから求められますよね?
>
> new byte[] byteArrayData;
> これでいいのでしょうか?
> 文字列の長さは決まっていないのですが
> 要素数は指定しないとエラーになりますか?

すみません。
byte[] byteArrayData = new byte[256];
このようにやったらできました。

繰り返しを行っているのですが、
ループから抜ける条件がわかりません・・・
引用返信 編集キー/
■53999 / inTopicNo.7)  Re[6]: StringをByte[]に
□投稿者/ ばいなり (5回)-(2010/10/01(Fri) 19:52:08)
> すみません。
> byte[] byteArrayData = new byte[256];
> このようにやったらできました。
>
> 繰り返しを行っているのですが、
> ループから抜ける条件がわかりません・・・

int j = 0;
for (int position = 0 ;textBox2.Text.Substring(position, 2) != String.Empty ; j++)
{
byteArrayData[j] = Convert.ToByte(textBox2.Text.Substring(position, 2), 16);
position += 2;
}
これでは、
指定された引数は、有効な値の範囲内にありません。
という例外が出てしまいました。
引用返信 編集キー/
■54000 / inTopicNo.8)  Re[6]: StringをByte[]に
□投稿者/ 魔界の仮面弁士 (1845回)-(2010/10/01(Fri) 20:01:14)
No53997 (ばいなり さん) に返信
> 繰り返しを行っているのですが、
> ループから抜ける条件がわかりません・・・

byte[] ToBinary(string hexString) {
    List<byte> wk = new List<byte>();
    for (int p = 0; p < hexString.Length; p += 2)
        wk.Add(Convert.ToByte(hexString.Substring(p, 2), 16));
    return wk.ToArray();
}

引用返信 編集キー/
■54096 / inTopicNo.9)  Re[7]: StringをByte[]に
□投稿者/ ばいなり (6回)-(2010/10/05(Tue) 08:38:19)
No54000 (魔界の仮面弁士 さん) に返信
> ■No53997 (ばいなり さん) に返信
>>繰り返しを行っているのですが、
>>ループから抜ける条件がわかりません・・・
>
> byte[] ToBinary(string hexString) {
> List<byte> wk = new List<byte>();
> for (int p = 0; p < hexString.Length; p += 2)
> wk.Add(Convert.ToByte(hexString.Substring(p, 2), 16));
> return wk.ToArray();
> }

遅くなってしまい申し訳ありませんでした。
ToBinaryが.Net CompactFrameで使えないようでしたので
int j = 0;
for (int p = 0; p < textBox2.Text.Length; p += 2)
{
byteArrayData[j] = (Convert.ToByte(textBox2.Text.Substring(p, 2), 16));
j++;
}
このようにしました。
これで思い通りに動かすことが出来ました。
ありがとうございました。
解決済み
引用返信 編集キー/
■54098 / inTopicNo.10)  Re[8]: StringをByte[]に
□投稿者/ 魔界の仮面弁士 (1849回)-(2010/10/05(Tue) 09:41:06)
No54096 (ばいなり さん) に返信
> int j = 0;
> for (int p = 0; p < textBox2.Text.Length; p += 2)
> {
>     byteArrayData[j] = (Convert.ToByte(textBox2.Text.Substring(p, 2), 16));
>     j++;
> }
> このようにしました。
変数 j は、何のために利用されているのでしょうか?



> ToBinaryが.Net CompactFrameで使えないようでしたので
先のコードは、アドエス(.NET Compact Framework 2.0)環境での
動作を確認していますので、そのまま動くはずなのですが…。

動作しないのは、メソッドのスコープの違いや using の有無の問題だけだったりはしませんか?
それとも、.NET Comapct Framework 1.0 をお使いなのでしょうか?


とりあえず、手動コンパイルで再確認。

/*

《ファイル名》
C:\a.cs

《CMD.EXE からコンパイル》
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CSC.EXE /noconfig /nostdlib+ ^
  /out:C:\a.exe ^
  /r:"C:\Program Files\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\mscorlib.dll" ^
  /r:"C:\Program Files\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Data.dll" ^
  /r:"C:\Program Files\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.dll" ^
  /r:"C:\Program Files\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Xml.dll" ^
  C:\a.cs

*/
using System;
using System.Collections.Generic;

class Sample {
  static void Main() {
    byte[] bin = ToBinary("A1B2C3");
    Console.WriteLine(BitConverter.ToString(bin));
    foreach(byte b in bin) Console.WriteLine("0x{0:X2}({0})", b);
  }
  static byte[] ToBinary(string hexString) {
    List<byte> wk = new List<byte>();
    for (int p = 0; p < hexString.Length; p += 2)
        wk.Add(Convert.ToByte(hexString.Substring(p, 2), 16));
    return wk.ToArray();
  }
}

引用返信 編集キー/
■54100 / inTopicNo.11)  Re[9]: StringをByte[]に
□投稿者/ ばいなり (7回)-(2010/10/05(Tue) 10:12:27)
No54098 (魔界の仮面弁士 さん) に返信
> ■No54096 (ばいなり さん) に返信
>>int j = 0;
>>for (int p = 0; p < textBox2.Text.Length; p += 2)
>>{
>> byteArrayData[j] = (Convert.ToByte(textBox2.Text.Substring(p, 2), 16));
>> j++;
>>}
>>このようにしました。
> 変数 j は、何のために利用されているのでしょうか?

byteArrayDataに格納する為に使用しています。

>>ToBinaryが.Net CompactFrameで使えないようでしたので
> 先のコードは、アドエス(.NET Compact Framework 2.0)環境での
> 動作を確認していますので、そのまま動くはずなのですが…。
>
> 動作しないのは、メソッドのスコープの違いや using の有無の問題だけだったりはしませんか?
> それとも、.NET Comapct Framework 1.0 をお使いなのでしょうか?
>
>
> とりあえず、手動コンパイルで再確認。
>
> /*
>
> 《ファイル名》
> C:\a.cs
>
> 《CMD.EXE からコンパイル》
> C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CSC.EXE /noconfig /nostdlib+ ^
> /out:C:\a.exe ^
> /r:"C:\Program Files\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\mscorlib.dll" ^
> /r:"C:\Program Files\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Data.dll" ^
> /r:"C:\Program Files\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.dll" ^
> /r:"C:\Program Files\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Xml.dll" ^
> C:\a.cs
>
> */
> using System;
> using System.Collections.Generic;
>
> class Sample {
> static void Main() {
> byte[] bin = ToBinary("A1B2C3");
> Console.WriteLine(BitConverter.ToString(bin));
> foreach(byte b in bin) Console.WriteLine("0x{0:X2}({0})", b);
> }
> static byte[] ToBinary(string hexString) {
> List<byte> wk = new List<byte>();
> for (int p = 0; p < hexString.Length; p += 2)
> wk.Add(Convert.ToByte(hexString.Substring(p, 2), 16));
> return wk.ToArray();
> }
> }

すみません。私が大きな勘違いをしていました。
ToBinaryを↑のコーディングでいうと
mainの中に記述していた為に
エラーが出ていました。
メソッドとして扱ったところ
正しく動作いたしました。
ご迷惑おかけしました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -