繁体   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