台灣最大程式設計社群網站
線上人數
703
 
會員總數:245981
討論主題:189559
歡迎您免費加入會員
討論區列表 >> C# >> 詢問封包實際值與抓封包軟體的數值換算
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
詢問封包實際值與抓封包軟體的數值換算
價值 : 20 QP  點閱數:404 回應數:18
樓主

momobear
門外漢
0 6
151 18
發送站內信

各位大大

我是用wireshark來抓封包

遇到一個問題,轉換的問題

原始封包的資料是3f 0e 83 e4

但軟體轉換出來的是value:0.5567

3f應該是代表負數,我不知道怎麼換算的

至於後面怎麼換算成0.5567,更是頭大,怎麼換算都不對

要請大家指教了

謝謝




搜尋相關Tags的文章: [ wireshark ] , [ 16進位轉換 ] ,
本篇文章發表於2020-02-07 10:01
1樓
回應

誰是誰
檢舉此回應
為什麼 3f 應該代表負數 ? 又是哪個軟體換算的? 抓的封包來自於哪種系統?

整個問題沒頭沒尾
本篇文章回覆於2020-02-07 10:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

momobear
檢舉此回應
大哥

我已經說明了是用wireshark軟體抓封包

這是這個軟體從封包裡換算出來的

就是這套軟體最下方的16位元數轉換成中間的格式
本篇文章回覆於2020-02-07 11:20
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

誰是誰
檢舉此回應
如果是以 wireshark 的轉譯為準,那就簡單了,基本上就是 Single Type 轉換而已。
本篇文章回覆於2020-02-07 11:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

誰是誰
檢舉此回應
依據 IEEE 規則, 3f 應該是正數
本篇文章回覆於2020-02-07 11:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

momobear
檢舉此回應
寫錯了寫錯了

3f應該是表示他後面接小數點

怎麼進位轉來轉去都不對

大部分由16進位轉10進位與軟體中間那個解析區都對

ASCII部分也是正常的

原始封包值3f ec cc cc cc cc cc cd 表示value是0.9

第一碼都是3f

所以我猜3f是代表小數點

Python跟PHP也是用3f代表是小數點

謝謝啦
本篇文章回覆於2020-02-07 13:14
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

誰是誰
檢舉此回應
3f ec cc cc cc cc cc cd 應該是 Double type 了

基本上浮點數的正負直就是看最後一個 bit 是 0 還是 1,3f 的 bit 8 是 0 ,所以是正數。大部分現代的程式語言應該都是遵循 IEEE 754, wiki 上面就有解釋了。
https://zh.wikipedia.org/wiki/IEEE_754
本篇文章回覆於2020-02-07 13:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

誰是誰
檢舉此回應
一下寫太快, bits index 從 0 開始算,所以正確是 3f 的 bit[7] 是 0 所以是正數。剛剛誤寫為 8 (因為心裡一直想著第 8 個 bit)
本篇文章回覆於2020-02-07 13:38
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

momobear
檢舉此回應
今天測試

3f:0.5
3e:0.125
3d:0.03125

不懂怎麼算的
應該是前面是3就算小數點

本篇文章回覆於2020-02-10 10:15
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

momobear
檢舉此回應
剛剛又測試

3f 01 = 0.503906
3f 02 = 0.507813
3f 03 = 0.511719
3f 04 = 0.515625
3f 05 = 0.519531

3f代表0.5

後4位數相減,幾乎相差3906

看似有規律~~不解為什麼??

請大大來討論
本篇文章回覆於2020-02-10 10:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

momobear
檢舉此回應
最後測試

原本是4bytes

測試後最後一個byte沒作用

測試了
3f 01 01 = 0.503922
3f 01 02 = 0.503937
3f 01 03 = 0.503952

最後的bytes相差都15,如果有扣前或扣後,就是16位元

反而是前篇不解

3f 01
3f 02
3f 03

都是固定相差3906

16*16也沒那麼多啊

請大家多多幫忙
本篇文章回覆於2020-02-10 11:16
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
作者回應

momobear
檢舉此回應
經過了我整天算來算去

應該有誤差

3f 00 00 = 0
3f 00 01 = 0.500015
3f 00 02 = 0.500031
3f 00 02 = 0.500046
......

我算到13,大多相差15,也有16

另外

3f 01 00 = 0.503606
3f 02 00 = 0.507812
3f 03 00 = 0.511719

這個都相差3906

實際上是4bytes

最後一個bytes我原本以為沒用

剛剛發現新大陸

繼續研究
本篇文章回覆於2020-02-10 15:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
不錯的參考

誰是誰
檢舉此回應
啊就遇到 4 bytes 就用 Single 轉換,遇到 8 bytes 就用 Double 轉換

本篇文章回覆於2020-02-10 21:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
作者回應

momobear
檢舉此回應
大大你回的答案是對的

但是為何要把Array倒置呢

謝謝
本篇文章回覆於2020-02-11 09:23
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
作者回應

momobear
檢舉此回應
我試著沒倒置前

var arr1 = new byte[] { 0 ,0 ,0 , 0x3f};
float value = BitConverter.ToSingle(arr1, 0);

這時候value就是0.5了

3f轉10進位是63

3f轉2進位是111111

不知道怎麼轉的

能否請大大解釋,感恩啊
本篇文章回覆於2020-02-11 16:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
回應

誰是誰
檢舉此回應
因為這世界上有兩種位元組順序表示法,參考 wiki https://zh.wikipedia.org/wiki/%E5%AD%97%E8%8A%82%E5%BA%8F
本篇文章回覆於2020-02-11 16:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   

回覆
如要回應,請先登入.