質問
"49 75 ? EB"
を b"\x49\x75\x3F\xEB"
(&[u8])と同等の物に変換したいのですが方法が分からないため、教えていただきたいです。当たり前なのですが?はasciiにおける3Fなので上記のように変換されているとお考えください。
最終的には変換したものを、&[u8]を引数に取る関数に渡したいです。
書いたコード
rust
1let string = "49 75 ? EB 10 ? ? 24 18 03 00 00 52" 2// まずsplitで空白ごとに区切って、それをmapでbytesに変換してcollectしたかった。 3let string_byte = string.split(" ").map(|b| b.as_bytes()).collect::<&[u8]>();
結果
std::iter::Iterator<Item=&[u8]>は&[u8]に変換できませんというエラーが発生しました。
どうも自分はイテレータから目的の型にcollectする際にいつもエラーに見舞われます。
変換ルールを明文化する(特殊な変換が必要なのは"?"だけでしょうか?)とともに、少なくともそのルールを意識したコード(特殊な変換である"?"はどこで処理していますか?)にしていただけますでしょうか。
質問者さんへ
変換ルールですが現状で以下のように少なくても2つのルールが混在しているので、それらを意識したコード(ifかmatchで場合分けを行う)を書いてみてください。また3.についても明確にしてください。
1. "49".as_bytes() → &[0x34_u8, 0x39_u8] →(変換A)→ 0x49_u8
2. "?".as_bytes() → &[0x3F_u8] →(変換B)→ 0x3F_u8
3. 他の文字列(2桁の16進数文字列でも"?"でもない) → どうなる?
すみません、Split後イテレータを消費できていないので実際内側の処理がどうなってるか一度もprintできず、このような曖昧なコードになってしまっていました。
また、as_bytesに関して勘違いをしていました。&strに対するas_bytesはascii tableに則って16進数に変換するものなんですね...。ではそもそもas_bytesを使うこと自体が間違っているのかもしれません。今考えると、"49".parse()で49i32に変換し、それをそのまま0x49に変換する策を模索するのが正しいアプローチなのかもしれません。
やりたいこととしましては、49、75などの、&str内の空白で区切られた数字をそれぞれ"そのまま"16進数に変換したいです。(例えば0x49、0x75などのように)
?に関してどのように変換するかですが、最終的に変換後の値が一意であり、?であるかどうかが判別できる形であれば、0x3Fに限らずどのように変換しても大丈夫です。
他の文字列はできればキャッチしてエラーを起こすのが好ましいです。
コードに関しましては、自力で試行錯誤してみてもしこれより程度の高いコードが出来ましたら更新させていただきます!><
> そもそもas_bytesを使うこと自体が間違っているのかもしれません。
>
> 49、75などの、&str内の空白で区切られた数字をそれぞれ"そのまま"16進数に変換したいです。(例えば0x49、0x75などのように)
u8型にfrom_str_radixというメソッドがあるので、それを使うのが楽です。
https://doc.rust-lang.org/stable/std/primitive.u8.html#method.from_str_radix
> コードに関しましては、自力で試行錯誤してみてもしこれより程度の高いコードが出来ましたら更新させていただきます!><
うまくいくといいですね。頑張ってください!
ありがとうございます!from_str_radixを使えば49を0x49に変換することができました!なので大元の課題も問題なく解決できると思います。&strやi32のクラスメソッドで使えそうなのを探していたのですが、u8のstaticメソッドは完全に失念していました...。ほんとに何でもご存じで尊敬しています。ありがとうございました!
回答1件
あなたの回答
tips
プレビュー