簡體   English   中英

如何將int轉換為byte的數組然后返回?

[英]How do I convert a int to an array of byte's and then back?

我需要通過NetworkStream發送一個整數。 問題是我只能發送字節。 這就是為什么我需要將整數分成四個字節並發送它們,另一端將其轉換回int。

現在我只需要在C#中使用它。 但是對於最終項目,我需要將四個字節轉換為Lua中的int。

[編輯]在Lua怎么樣?

BitConverter是最簡單的方法,但如果你想控制字節的順序,你可以自己進行位移。

int foo = int.MaxValue;
byte lolo = (byte)(foo & 0xff);
byte hilo = (byte)((foo >> 8) & 0xff);
byte lohi = (byte)((foo >> 16) & 0xff);
byte hihi = (byte)(foo >> 24);

另外..BitConverter的實現使用不安全和指針,但它簡短而簡單。

public static unsafe byte[] GetBytes(int value)
{
   byte[] buffer = new byte[4];
   fixed (byte* numRef = buffer)
   {
      *((int*) numRef) = value;
   }
   return buffer;
}

嘗試

BitConverter.GetBytes()

http://msdn.microsoft.com/en-us/library/system.bitconverter.aspx

請記住,返回數組中字節的順序取決於系統的字節順序。

編輯:至於Lua部分,我不知道如何轉換回來。 您總是可以乘以16來獲得與按位移位相同的功能。它不是很漂亮,我會想象有一些庫或某些東西可以實現它。 同樣,添加字節的順序取決於字節順序,因此您可能想要閱讀它

也許你可以轉換回C#?

以下是Lua中的一些函數,用於將32位二進制補碼數轉換為字節,並將四個字節轉換為32位二進制補碼數。 可以/應該進行更多檢查以驗證傳入參數是否有效。

-- convert a 32-bit two's complement integer into a four bytes (network order)
function int_to_bytes(n)
  if n > 2147483647 then error(n.." is too large",2) end
  if n < -2147483648 then error(n.." is too small",2) end
  -- adjust for 2's complement
  n = (n < 0) and (4294967296 + n) or n
  return (math.modf(n/16777216))%256, (math.modf(n/65536))%256, (math.modf(n/256))%256, n%256
end

-- convert bytes (network order) to a 32-bit two's complement integer
function bytes_to_int(b1, b2, b3, b4)
  if not b4 then error("need four bytes to convert to int",2) end
  local n = b1*16777216 + b2*65536 + b3*256 + b4
  n = (n > 2147483647) and (n - 4294967296) or n
  return n
end

print(int_to_bytes(256)) --> 0 0 1 0
print(int_to_bytes(-10)) --> 255 255 255 246
print(bytes_to_int(255,255,255,246)) --> -10

對於Lua,請查看Roberto的結構庫。 (羅伯托是Lua的作者之一。)對於具體案例來說,它比一般情況更為通用,但是不一定需要交換一個int ,之后需要交換其他簡單類型或更大的類型。結構。

假設本地字節順序在兩端都是可接受的(這可能是一個錯誤的假設,偶然),那么您可以將數字轉換為4字節整數:

buffer = struct.pack("l", value)

再回來:

value = struct.unpack(“l”,buffer)

在這兩種情況下, buffer都是包含字節的Lua字符串。 如果你需要從Lua訪問各個字節值, string.byte就是你的朋友。

要指定打包數據的字節順序,請將格式從"l"更改為"<l"對於little-endian)或">l"對於big-endian)。

struct模塊在C中實現,在Lua可以使用之前,必須將其編譯為您的平台的DLL或等效項。 也就是說,它包含在Lua for Windows電池包含的安裝包中,這是在Windows系統上安裝Lua的常用方法。

調查BinaryWriter / BinaryReader類

將int轉換為字節數組並顯示:BitConverter ...

www.java2s.com/Tutorial/CSharp/0280__Development/Convertaninttoabytearrayanddisplay.htm

整數到字節 - Visual Basic .NET的答案

http://bytes.com/topic/visual-basic-net/answers/349731-integer-byte

如何:將字節數組轉換為int(C#編程指南)

http://msdn.microsoft.com/en-us/library/bb384066.aspx

正如Nubsis所說, BitConverter是合適的,但沒有保證的字節順序。

我在MiscUtil中有一個EndianBitConverter類,它允許您指定字節順序。 當然,如果您只想為單個數據類型( int )執行此操作,則可以手動編寫代碼。

BinaryWriter是另一種選擇,這確實保證了很少的字節順序。 (同樣,如果你想要其他選項,MiscUtil有一個EndianBinaryWriter 。)

要轉換為byte []:

BitConverter.GetBytes(INT)

http://msdn.microsoft.com/en-us/library/system.bitconverter.aspx

要轉換回int:

BitConverter.ToInt32(byteArray,offset)

http://msdn.microsoft.com/en-us/library/system.bitconverter.toint32.aspx

我不確定Lua。

如果你擔心字節順序,請使用John Skeet的EndianBitConverter。 我已經使用它了,它可以無縫地工作。

C#支持自己實現的htons和ntohs:

但它們只能在signed int16,int32,int64上工作,這意味着你可能最終會進行大量不必要的轉換以使它們工作,如果你使用最高位除了簽署整數以外的任何東西,你'重新擰緊。 去過也做過。 :: tsk ::: tsk :: Microsoft因為沒有在.NET中提供更好的字節順序轉換支持。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM