• ベストアンサー

C#でtrimができません

VisualC#2010開発での質問です。 byte[] b = new byte[1024]; stream.Read(b, 0, b.Length); string s= Encoding.ASCII.GetString(b); とやったあとの文字列sの末尾空白がtrimできません。 どうやればよいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

TrimEndメソッドを使います。 ありがちな間違いは,System.Stringがimmutableであることを忘れて処理することでしょうか。 s.TrimEnd(); としてもsに変化はなく,TrimEndメソッドの戻り値として末尾の空白類が削除された文字列が返るので, s = s.TrimEnd(); としなければいけません。

covachan
質問者

お礼

回答有難うございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 文字コード判別ルーチンGetCodeの使用方法

    文字コード判別ルーチンGetCodeの使用方法 メールマガジン「.NETプログラミング研究」で紹介されている文字コード判別ルーチンGetCode(http://dobon.net/vb/dotnet/string/detectcode.html)を利用してサイトからダウンロードしたHTMLの文字コード変換をしています 思う通りに変換出来ることもありますが、目も眩むような宇宙語になってしますことも多々あります このGetCodeルーチンは既にVB.NETでもC#でも相当な実績があると評価されています ですから使用方法の誤りなのでしょう ご指摘頂ければ幸いです ソース(C#)は下記の通りです string MyReadString; //変換後のHTML文書が格納される using ( WebClient MyClient = new WebClient()) using ( Stream MyStream = MyClient.OpenRead(http://www.~~)) using ( MemoryStream MyMemoryStream = new MemoryStream()) { byte[] ByteBuffer = new byte[4096]; //サイトからHTML文書を MyMemoryStream.Seek(0, SeekOrigin.Begin); // Memory Streamに読込み while (true) { int ReadByteLength = MyStream.Read(ByteBuffer, 0, ByteBuffer.Length); if (ReadByteLength <= 0) { break; } //読込み終了 MyMemoryStream.Write(ByteBuffer, 0, ByteBuffer.Length); } byte[] AllHTML = new byte[MyMemoryStream.Length]; //全HTML文書を MyMemoryStream.Seek(0, SeekOrigin.Begin); // byte配列に読込み MyMemoryStream.Read(AllHTML, 0, AllHTML.Length); System.Text.Encoding enc = GetCode(AllHTML); //文字コードを判定する ←←←この箇所です MyReadString = enc.GetString(AllHTML); //判定された文字コードで } // byte配列からstringへ変換する

  • trim()メソッドの使用方法とキャストの仕方について

    こんばんは、今回はtrim()メソッドの使用方法とキャストの方法についてお伺い致します。 trimメソッドを使用して文字列の前後の空白を削除したいのですが、 通常 String str = " 「こんにちは」"; str = str.trim(); とコーディングしコンパイルして表示するとちゃんと「こんにちは」となるのすですが、これが ArrayList list = new ArrayList(); BufferedReader br= new BufferedReader(new FileReader(Test.txt); while((str = br.readLine()) !=null){ str = str.trim(); list.add(str); } br.close(); とコーディングしコンパイルは通るのですが、 「こんにちは」のままで"「"の前にある空白が削除されてません。 私なりに「型」の違いでが原因ではないかと思い、java.io.ArrayList型からjava.lang.String型へキャストしようとしているのですが、コンパイルエラーが出てしまします。 プログラムコードは ArrayList list = new ArrayList(); String s; s = (String)list; としています。 エラー内容は ScheduleControlCall.java:142: 変換できない型 出現: java.util.ArrayList 要求: java.lang.String s = (String)list; ^ エラー 1 個 となっています。 度々ですが、ご指導お願い致します。

    • ベストアンサー
    • Java
  • C#でHP上の特定データを自動更新で抽出したい

    ブラウザを立ち上げることなくHPに自動ログイン後、特定の表示データを抽出してリアルタイムに更新表示させたい(ブラウザでは更新ボタンのクリックが必要)。 ニコニコ動画の自動ログイン方法が公開されていますのでそれを真似て下記のプログラムを作成し、見かけ上は正常に動作していますが、これって「GetHtml」を呼ぶ度にログイン → ログアウトを繰り返すのでしょうか? もし、そうであればそれの回避方法を教えて頂けないでしょうか。(.Close()を呼ばないとか?) また、その確認方法があれば併せてお願いします。 /// ログイン (起動時1回のみ呼び出し) public bool LogIn() {  Hashtable hash = new Hashtable();  hash["username"] = "name";  hash["password"] = "123";  hash["Login"] = "login";  string s_param = "";  foreach (string s in hash.Keys)  {  s_param += string.Format("{0}={1}&", s, hash[s]);  }  HttpPost("Https", s_param); } /// POST送信 public void HttpPost(string s_url, string s_param) {  httpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(s_url);  CookieContainer cookieContainer = new CookieContainer();  httpWebRequest.CookieContainer = cookieContainer;  httpWebRequest.ContentType = "application/x-www-form-urlencoded";  byte[] data = Encoding.ASCII.GetBytes(s_param);  httpWebRequest.ContentLength = data.Length;  httpWebRequest.Method = "Post";  Stream reqStream = httpWebRequest.GetRequestStream();  reqStream.Write(data, 0, data.Length);  reqStream.Close();  WebResponse webResponse = httpWebRequest.GetResponse();  Stream resStream = webResponse.GetResponseStream();  encoder = Encoding.GetEncoding("Shift_JIS");  StreamReader streamReader = new StreamReader(resStream, encoder);  spHtml = streamReader.ReadToEnd();  streamReader.Close();  webResponse.Close(); } /// HTML受信(タイマーイベントで常時呼び出し) private string GetHtml(string s_url) {  httpWebRequest = (HttpWebRequest)WebRequest.Create(s_url);  httpWebRequest.CookieContainer = cookieContainer;  webResponse = httpWebRequest.GetResponse();  Stream resStream = webResponse.GetResponseStream();  StreamReader streamReader = new StreamReader(resStream, encoder);  string Html = streamReader.ReadToEnd();  streamReader.Close();  resStream.Close();  return Html; }

  • C#で通信処理。応答がない場合、すぐエラーにしたい

    VS2005、C#で通信処理をしています。 やりたいことは「接続後、データを渡してその返答データをもらう」です。 //サーバーに接続 Int32 port = 9999; TcpClient client = new TcpClient(server, port); //サーバーにメッセージを送信 Byte[] dataA = System.Text.Encoding.UTF8.GetBytes(message); Byte[] dataB = Byte[128]; NetworkStream stream = client.GetStream(); stream.Write(dataA, 0, dataA.Length); len = stream.Read(dataB, 0, dataB.Length) client.Close(); ネットのサンプルを参考にさせてもらい、上のようなソースを作ることができたのですが、2つの疑問があります。 (1)接続時に指定したIPアドレスが存在しない場合、エラーが返ってくるのが遅いです。そういうものなのでしょうか。たとえば、即時返答などはできないのでしょうか。 (2)接続してデータを送っても、向こうからデータが返ってこなければずっと待機したままです。たとえばミリセカンドで切ることはできないのでしょうか。 もしくは指定のミリセカンド経過後強制的にエラー処理に飛ばす等はできないのでしょうか。 通信処理をやるのが初めてで定石がよくわからず、あれこれ試している状態です。 処理についてご存じの方、ご指南いただけたらと思います。参考になるサイトや検索キーワードだけでも教えていただけたら嬉しいです。 よろしくお願いします。

  • 簡単なネットワークプログラムなのですが・・・

    ネットワーク通信の基礎を学ぼうと、いろいろなサイトをみながらSocket通信の簡単なメッセージ送受信を行おうとしているのですが、streamを使って送信したメッセージを送信、又は受信するときにsocketを閉じないと送信できません。 そして常に受信させたいのですが、socketを閉じているため、nullexceptionになってしまいます。 何か別の手はありますでしょうか・・・? 現在↓のような感じで行っています。 private void 待機ToolStripMenuItem_Click(object sender, EventArgs e) { //サーバーを開始 Int32 port = 9999; IPAddress localAddr = IPAddress.Parse("127.0.0.1"); server = new TcpListener(localAddr, port); server.Start(); threadA = new Thread(recvData); threadA.Start(); } // 受信用(マルチスレッド) public void recvData() { //接続待機 this.Invoke(new MyDelegate(delegate { textBox1.Text = "接続待機中"; })); TcpClient client = server.AcceptTcpClient(); //接続 this.Invoke(new MyDelegate(delegate { textBox1.Text = "接続されました"; })); NetworkStream stream = client.GetStream(); // 無限ループ while (true) { Byte[] bytes = new Byte[20]; //わざと小さく取ってある。 int i; //メッセージを受信 while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) { String data = System.Text.Encoding.UTF8.GetString(bytes, 0, i); Console.WriteLine(String.Format("受信: {0}", data)); } client.Close(); }

  • VB2005 で encoding="Shift_JIS"や"EUC-JP"のXMLファイルを保存する方法

    VB2005, XML の初心者です。 VB2005で encoding="Shift_JIS" や "EUC-JP" のXMLデータをファイルに保存するにはどうすれば良いのでしょうか。 encoding="UTF-8"であれば、下記で保存できますが、="Shift_JIS" や "EUC-JP" になると保存でエラーになってしまいます。 下記ソースでは、strXMLには正しくXMLが入っていますが、saveするとエラーになり、ファイルの中身を確認すると、日本語の箇所で切れていました。 Public Client As TcpClient Dim stream As NetworkStream stream = Client.GetStream() Dim Data(10000) As Byte Dim len As Int16 = stream.Read(Data, 0, Data.Length) strXML = System.Text.Encoding.UTF8.GetString(Data, 0, len) MsxmlDoc = New MSXML2.DOMDocument Msxmldoc.Loadxml(strXML) MsxmlDoc.save ( "C:\XML.xml") 文字コードについても初心者ですので、ヒントになるようなことでも教えていただければ幸いです。 よろしくお願い致します。

    • ベストアンサー
    • XML
  • JavaでXORによる暗号化

    JavaでXORによる暗号化について調べていたら下記URLのサイトを見つけました。 http://www.eeb.co.jp/2007/07/_10_1.html そこでサンプルにあった下記プログラムをvalue と key を変えて実行してみたところ value の中の「は」、「で」がうまく復元されず文字化けしてしまいました。 どこが悪いのかよくわからないのですがお分かりになられる方がいらっしゃいましたら 教えていただけますでしょうか。 public class XorTest { //================================================== // メイン //================================================== public static void main(String[] args) { String value = "abcd本日はお日柄もよろしいようで"; String key = "1"; // 暗号化前出力 print("暗号化前", value); // 暗号化 byte[] byteEncodeArray = encode(value.getBytes(), key); value = new String(byteEncodeArray); // 暗号化後出力 print("暗号化後", value); // 復元 byte[] byteDecodeArray = decode(value.getBytes(), key); value = new String(byteDecodeArray); // 復元後出力 print("復元後", value); } //================================================== // 暗号化 //================================================== private static byte[] encode(byte[] src, String key) { byte[] byteKeyArray = new byte[0]; byte[] byteEncArray = new byte[src.length]; // キーの文字列を変換する文字列をカバーするまで繰り返す while(byteKeyArray.length < src.length) { byteKeyArray = (new String(byteKeyArray) + key).getBytes(); } // 変換 for (int i = 0; i < src.length; i++) { byteEncArray[i] = (byte)(src[i]^byteKeyArray[i]); } return byteEncArray; } //================================================== // 復元 //================================================== private static byte[] decode(byte[] src, String key) { return encode(src, key); } //================================================== // ダンプ文字列取得 //================================================== private static String getDump16(byte[] value) { StringBuffer buf = new StringBuffer(); for (int i = 0; i < value.length; i++) { String hex = Integer.toHexString((int)value[i] & 255); // 4桁に揃える hex = "0000" + hex; hex = hex.substring(hex.length() - 4, hex.length()); // バッファに追加(空白区切り、10桁ずつ改行) buf.append(hex + (i % 10 == 9?System.getProperty("line.separator"):" ")); } return buf.toString().trim(); } private static void print(String title, String value) { System.out.println("【 " + title + " 】"); System.out.println("-----------------------------"); System.out.println(value); System.out.println(getDump16(value.getBytes())); System.out.println(); System.out.println(); } }

    • ベストアンサー
    • Java
  • 「C#」文字コードの取得&文字変換

    C#で文字コードを調べるプログラムを作成しています。 そこで2つ質問をさせてください。 1つ目(文字コード調べ) TextBoxに漢字を入力して,各エンコーディングの文字コードを調べるときに,UNICDEの場合, Encoding enc_default = Encoding.GetEncoding(932); string input = tb_input.Text; byte[] byte_input = enc_default.GetBytes(input); string outtext_unicode = ""; Encoding enc_unicode = Encoding.Unicode; byte[] byte_unicode = Encoding.Convert(enc_default,enc_unicode, byte_input); foreach (byte b in byte_unicode) { outtext_unicode += string.Format("{0:X}", (int)b); } tb_output_unicode.Text = outtext_unicode; とすると,調べたい文字コードがLE(リトルエディアン)で出力されます。これをBE(ビッグエディアン)で出力されるにはどうしたらよいでしょうか? ご存知の方がいらっしゃいましたら,ぜひ教えてください。 よろしくお願いいたします。 2つ目(文字コードから文字を取得する) 上記の質問と逆のパターンで,TextBoxに文字コードを入力してもらい,人間が読める文字に変換する場合下記のようなコードを書くと, string codePoint_string = tb_output_unicode.Text; int codePoint = int.Parse(codePoint_string); char c = (char)codePoint; tb_input.Text = Convert.ToString(c); ASCIIの文字コードを入力した場合には,きちんと変換してくれるのですが,漢字の文字コードを入力すると,FormatExceptionが発生します。 何か勘違いをしているのかもしれませんが,いまいちやり方が創造できません。 こちらも,ご存知の方がいらっしゃいましたら,ご教示願います。

  • [C#]FTPでの複数のファイルのアップロード

    ネットで調べたところ1つのファイルであれば、 下記の記述でアップロードできることがわかったのですが、 別々のフォルダにあるにファイルを複数同時にアップロードするプログラムがわかりません。 どなたかご教示ください。よろしくお願いいたします。 using System; using System.Net; using System.IO; class FtpWebPut {  static void Main()  {   string uri = "ftp://servername/Upload/secret.png";   string myFile = "tmp.png";   WebRequest req = WebRequest.Create(uri);   req.Credentials = new NetworkCredential("user01", "mypassword");   req.Method = WebRequestMethods.Ftp.UploadFile;   using (Stream st = req.GetRequestStream())   using (FileStream fs = new FileStream(myFile, FileMode.Open))   {    Byte[] buf = new Byte[1024];    int count = 0;    do    {     count = fs.Read(buf, 0, buf.Length);     st.Write(buf, 0, count);    }    while (count != 0);   }  } }

  • TcpClientとWebbrowser

    TcpClientでストリームからバイトでhttpデータを取得しましたが、 EUC-JPの文字コードのサイトだけがhtml内に本来入るはずのない数値が沢山現れます。 いっそのことWebBrowserコントロールを使ってサイトにアクセスし、DocumentTextを参照した方が手っ取り早いでしょうか? バイトから文字列の変換はわかりましたが、文字列から文字列へ文字コードを変換する方法がわからず困っています。ご存知の方教えていただけますか? 以下、EUC-JPの時に数値が混入するサンプルです。 '--------------------------------------------------------------------------------------------------- ' httpファイルを読み込む '--------------------------------------------------------------------------------------------------- Private Sub GetHttp(ByVal host As String, ByVal port As Integer, ByVal cmd As String, ByRef retcode As Integer, ByRef http_data As String) 'TCP/IP接続を行う Dim client As New TcpClient() Try client.Connect(host, port) 'ストリームを取得する Dim stream As NetworkStream = client.GetStream() Dim param As String = cmd + " HTTP/1.0" + ControlChars.CrLf+ControlChars.CrLf Dim buffer() As Byte = System.Text.Encoding.ASCII.GetBytes(param) stream.Write(buffer, 0, buffer.Length) Dim sb As New System.Text.StringBuilder() Dim len As Integer http_data = "" Dim bytData() As Byte = New Byte(1048576) {} '1MB Dim strCharset As String = "" 'すべて受信する Dim cnt As Integer For cnt = 1 To 1000 '受信 len = stream.Read(bytData, 0, bytData.Length) 'バッファサイズを与えて、受信サイズを得る sb.Append(Encoding.GetEncoding("utf-8").GetString(bytData, 0, len)) 'utf-8 If Not stream.DataAvailable Then '受信キューにデータがある場合はTrue Exit For End If Next '正常に受信できた場合 http_data = sb.ToString retcode = 0 Catch ex As Exception retcode = -1 http_data = "" Finally client.Close() End Try End Sub '----- Dim host As String = "ホスト名" Dim port As Integer = 80 Dim cmd As String = "GET /index.html" '戻り値 Dim retcode As Integer Dim http_data As String = "" Dim charset As String = "" Try GetHttp(host, port, cmd, retcode, http_data) Catch ex As Exception MessageBox.Show(ex.Message, "エラーです。") End Try