
COMポートを使用して通信をしようとしています。
制御コマンドを1byte区切りで送信するのですが、byte型で扱う際、-128~-1の扱いが思うようにいきません。
ウェブを検索して符号拡張など検討してみたのですが解決できませんでした。
いろいろやってみましたが、基本的には
byte[] byteArray = {0x12,0x20,-0x80};
String str = new String(byteArray,0);
BufferedWriter bw;
bw.write(str);
このようになっています。
0x12や0x20の送信は、信号を調べる機器にて正しく送信されていることが確認できたのですが、-0x80は予期せぬ値になってしまいます。
-0x80では、16進でC0,3Fなどになってしまいます。
二進で先頭に1がたっていることが原因なのでしょうか。。。
int型にしたり、byte型そのままで送ったり、0x40から左にビットシフトして(&ffも忘れずに)代入したりもしたのですが、結果は同じでした。
ご教授宜しくお願いします!
No.1ベストアンサー
- 回答日時:
こちらで実験してみました。
たしかに変な数値になります。
実際にどういう仕組でおかしくなっているのかはわかりません。
しかし、おそらく出力にWriterを使っているのが問題だろうと思われます。
Javaの出力には、OutputStream系列と、Writer系列があり、
バイナリデータはOutputStream、テキストファイルはWriterと、
使い分けをすることになっています。
Writer系列では、おそらく内部で1回Unicodeに変換されるので、
その過程でエラーが出たのだろうと思います。
見たところ、出力したいのはバイナリデータのようなので、
プログラム中でWriterを使っているところを
OutputStreamに置き換えることをお勧めします。
もしそれが難しければ、OutputStreamとWriterをつなぐ
OutputStreamWriterの使用も検討してみてください。
---------------------------
(たぶん正常に動くコード)
byte[] byteArray = {0x12,0x20,-0x80};
try{
FileOutputStream fo = new FileOutputStream("test.out");
BufferedOutputStream bw = new BufferedOutputStream(fo);
bw.write(byteArray, 0, 3);
bw.flush();
}catch(Exception e){}
-----------------------------
No.2
- 回答日時:
#1さんの仰るとおり、OutputStreamを使用することで解消されます。
予期しない値に変換される箇所は、Writerの内部ですね。
3Fは文字で言うと'?'あたります。順を追っていくと、
> byte[] byteArray = {0x12,0x20,-0x80};
この3つの値は、2行目のnew Stringでcharに変換されます。3つ目の文字は文字に変換できない値になります。(一文字目も見慣れない文字になりますが、サポート内のようですね)
> String str = new String(byteArray,0);
コンストラクタString(byte[], int)第一引数を2バイト目のビット列に、第二引数を1バイト目のビット列に使用してcharを作成します。APIにあるとおり、第一引数のバイト列はascii文字に使用可能な値をとる必要があります。
> BufferedWriter bw;
> bw.write(str);
writerがOutputStreamにバイト列として書き出す際に、文字コードの変換が行われます。この際、変換できない値はすべて'?'に置き換えられます。'?'がビット列になって送信されるので、相手には0x003Fという値が送信されることになります。
もう一度短く書くと、
new Stringで-0x80は文字として不正な値になる
→writeで'?'に変換される
→streamには'?'がビット列になったものが送信される
→相手に0x00CFで届く
という流れになります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- 運輸業・郵便業 郵便番号4ケタ「8790」の送り先に、通常の郵便番号で送るとどうなりますか? 3 2023/01/16 15:00
- 物理学 あのこれは、間違いと 3 2022/11/13 12:22
- 宇宙科学・天文学・天気 宇宙人との通信方法を考えました。 8 2022/05/14 15:59
- その他(スマートフォン・携帯電話・VR) SMSの受信について LINEの設定において、設定途中のSMSの受信ができなくて困っています。 私は 3 2023/08/03 11:53
- 固定電話・IP電話・FAX 業務用ファックスについて 5 2022/09/28 19:08
- ダイヤルアップ Raspberry Piでアナログモデム経由で音声再生 1 2022/05/20 18:01
- ドメイン・サーバー・クラウドサービス Google Workspaceでの独自ドメインのメール送信について 2 2022/05/31 19:48
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
javascriptで文字列のsjis利用...
-
JavaのStringクラスに「外字」...
-
「C#」文字コードの取得&文字変換
-
javaで質問です。 文字列2023/2...
-
C言語32bitから64bitの移行につ...
-
文字列の比較
-
Visual Basic でのコードをASCI...
-
int型のゼロ埋め
-
全角英数字とハイフンを半角に...
-
シフトJISのエンコード
-
数字を読みに変換する方法について
-
文字化け対策について
-
あるディレクトリにある複数の...
-
byte型のマイナスの扱いについて
-
JAVAソースコードの暗号化
-
どんな時にIteratorを使うと便...
-
javaの日本語並び替えについて...
-
greasemonkeyのスプリクトの222...
-
TEXTAREAからのデータを改行入...
-
ダブルクォーテーションのrepla...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルクォーテーションのrepla...
-
javaで質問です。 文字列2023/2...
-
javascriptで文字列のsjis利用...
-
Path型をString型へ変換する(Java)
-
カタカナをローマジに変換する。
-
Visual Basic でのコードをASCI...
-
JavaのStringクラスに「外字」...
-
エクセルVBAで「〜」が表現でき...
-
Windows-31Jからutf-8への変換...
-
C言語32bitから64bitの移行につ...
-
文字列の比較
-
int型のゼロ埋め
-
javaの初歩的な質問です。
-
byte型のマイナスの扱いについて
-
substring バイト単位でやりたい
-
JAVAでのShift-JISとEUC-JP間の...
-
byte配列をImageに変換する
-
byte[] を long,float とかに...
-
UTF-8とUnicodeの互換性
-
COBOLで半角カナを全角カナに変換
おすすめ情報