如何将整数转换为字节数组并再次转换回来?

我需要通过NetworkStream发送一个整数,但问题是我只能发送字节。 这就是为什么我需要分割整数,将其分成四个字节发送,然后在另一端将其转换回int。

目前,我只需要在C#中实现。但对于最终项目,我需要将四个字节转换为Lua中的int。

[编辑] Lua中怎么办?

原文链接 https://stackoverflow.com/questions/3099275

点赞
stackoverflow用户134098
stackoverflow用户134098

尝试

BitConverter.GetBytes()

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

请记住,返回的数组中字节的顺序取决于您的系统的字节序。

编辑: 至于 Lua 部分,我不知道如何进行转换。您可以通过乘以 16 来获得按 4 位进行位移的相同功能。这不是很好看,我想应该有一些库或类可以实现它。同样,添加字节的顺序取决于字节序,所以您可能需要对此进行一些学习。

也许您可以在 C# 中进行转换?

2010-06-23 06:07:48
stackoverflow用户94155
stackoverflow用户94155

调查 BinaryWriter/BinaryReader 类

2010-06-23 06:08:14
stackoverflow用户237363
stackoverflow用户237363

将一个整数转换成一个字节数组并显示:BitConverter...

www.java2s.com/Tutorial/CSharp/0280\_\_Development/Convertaninttoabytearrayanddisplay.htm

整数转换成字节 - Visual Basic .NET 答案

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

如何:将字节数组转换为整数(C# 编程指南)

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

2010-06-23 06:10:10
stackoverflow用户22656
stackoverflow用户22656

正如Nubsis所说,BitConverter是适当的但没有保证字节顺序。

我在MiscUtil中有一个EndianBitConverter类,它允许您指定字节顺序。当然,如果您只想针对单个数据类型(int)执行此操作,您可以手动编写代码。

BinaryWriter是另一个选项,并且_确保_使用小端字节顺序。 (同样,如果您想要其他选项,MiscUtil有一个EndianBinaryWriter。)

2010-06-23 06:14:05
stackoverflow用户153390
stackoverflow用户153390

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 的实现使用了 unsafe 和指针,但它很短且简单。

public static unsafe byte[] GetBytes(int value)
{
   byte[] buffer = new byte[4];
   fixed (byte* numRef = buffer)
   {
      *((int*) numRef) = value;
   }
   return buffer;
}
2010-06-23 06:28:48
stackoverflow用户290340
stackoverflow用户290340

将其转换为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::微软未在.NET中提供更好的字节序转换支持。

2010-06-23 07:02:12
stackoverflow用户173806
stackoverflow用户173806

下面是在 Lua 中将一个 32 位二进制补码数转换为字节以及将四个字节转换为 32 位二进制补码数的一些函数。应该做更多的检查以验证传入的参数是否有效。

-- 将 32 位二进制补码整数转换为四个字节(网络顺序)
function int_to_bytes(n)
  if n > 2147483647 then error(n.." 太大了",2) end
  if n < -2147483648 then error(n.." 太小了",2) end
  -- 调整为 2 的补码
  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

-- 将字节(网络顺序)转换为 32 位二进制补码整数
function bytes_to_int(b1, b2, b3, b4)
  if not b4 then error("需要四个字节才能转换为整数",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
2010-06-23 19:46:36
stackoverflow用户68204
stackoverflow用户68204

对于Lua,可以查看Roberto的struct库。(Roberto是Lua的作者之一。)它比实际需要的更通用,但是很可能在需要交换int之后不久就需要交换其他简单类型或更大的结构体。

假设本地字节顺序在两端都是可接受的(顺便说一下,这很可能是一个糟糕的假设),那么可以使用以下代码将数字转换为4字节整数:

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

通过以下代码将其转换回来:

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

在两种情况下,buffer是包含字节的Lua字符串。如果需要从Lua访问单个字节值,string.byte将是您的好朋友。

要指定打包数据的字节顺序,请将格式从"l"更改为"<l"(小端)或">l"(大端)。

struct模块是用C实现的,必须在平台上编译为DLL或等效项后才能被Lua使用。话虽如此,它包含在Lua for Windows预装程序包中,这是在Windows系统上安装Lua的常用方式。

2010-06-24 00:37:16